开篇

我写下这篇文章是两个目的
(1)最近要有项目了,很久没做内网了,温习一下。
(2)希望正在学习安全的小伙伴不要踏入我初学内网的误区。
先来谈谈我对内网的理解吧,不是技术的方向。
内网学的东西很多,很杂。当时我问了我的大哥,他给我的一句话确实影响我至今。我说内网就说信息收集,cmd命令能收集,powershell收集也很多,还有类似wmic,或者一些脚本语言写的信息收集工具,太多了,这些都要学真的太浪费时间了。他是这么跟我说的,很多东西你要学一辈子都学不完,但是你把一个东西学好了,结果都是一样的。确实是这么个道理,学习需要广度,能让你碰到不同的情况乃至极限情况你有解决问题的思路。学习需要深度,你能在正常情况下创造乃至开辟一条新的道路。所以说完全没有必要什么命令都背什么命令都记得清清楚楚,最重要的是要有自己的一套渗透手法,能够达到效果,就是好的。没人在乎你的过程,除非你真的很6。好了。开始今天的主题。
内网这一块不是我的擅长,但是也有幸参加过一些护网,做过一点内网渗透。总结性的来说说我的思路。
一般来说,我们拿了权限做的第一件事是维权,维权这一块以后再说。因为现在很多时候涉及免杀,免杀这一块我研究的不是很多。然后就会对当前主机进行信息收集。我就献丑说一下自己的信息收集思路。可能命令不是很多,都是靠平时自己收集的,主要是提供一个思路,如何实现自动化并且不触发告警,才是应该操心的。

文件类

(1)配置文件
如果是从web打进去的,配置文件是一定要找到,找到了数据库的账号密码,如果是站库分离可能会拿下第二台,如果不是也能获取数据库的数据,或者说用来做密码复用。配置文件一般就在web目录找config等标志性文件。其中如果密码存在加密的大众系统可以试试去github找找有没有解密脚本。自定义的加密可以尝试找源码进行破解。

(2)敏感文件
桌面是一定要看的,很多人有保存文件在桌面的习惯,特别是个人机。很有可能记录了一些密码信息或者其他网站的登录账号密码信息,以及一些敏感文件。
(3)其他目录
这种就是比较随缘了,因为个人习惯不同,稍微有点安全的人可能不会放在桌面,放在D盘啊等地方。这种可能就不是很好找,但是也可以全局搜索文件名,文件内容包含passwd,user,password等字段的文件。回收站也可以看看。
下面放一些我常用的命令,来源于之前记录的别人发的,但是原文找不到了。自己根据实际情况改。

dir %APPDATA%\Microsoft\Windows\Recent //查看最近打开的文档
findstr /si password  config.*  *.ini *.txt *.properties //递归搜索后面文件的password字段
dir /a /s /b "*conf*" > 1.txt    //递归查找当前目录包含conf的文件
findstr /s /i /c:"Password" 目录\*.txt  //递归查找目录下的txt中的oassword字段
for /r 目录 %i in (account.docx,pwd.docx,login.docx,login*.xls) do @echo  %i >> C:\Users\e0mlja\desktop\123.txt     //递归查找目录下的敏感文件输出到桌面123.txt中
指定目录搜索各类敏感文件
dir /a /s /b d:\"*.txt"
dir /a /s /b d:\"*.xml"
dir /a /s /b d:\"*.mdb"
dir /a /s /b d:\"*.sql"
dir /a /s /b d:\"*.mdf"
dir /a /s /b d:\"*.eml"
dir /a /s /b d:\"*.pst"
dir /a /s /b d:\"*conf*"
dir /a /s /b d:\"*bak*"
dir /a /s /b d:\"*pwd*"
dir /a /s /b d:\"*pass*"
dir /a /s /b d:\"*login*"
dir /a /s /b d:\"*user*"
收集各类账号密码信息
findstr /si pass *.inc *.config *.ini *.txt *.asp *.aspx *.php *.jsp *.xml *.cgi *.bak
findstr /si userpwd *.inc *.config *.ini *.txt *.asp *.aspx *.php *.jsp *.xml *.cgi *.bak
findstr /si pwd *.inc *.config *.ini *.txt *.asp *.aspx *.php *.jsp *.xml *.cgi *.bak
findstr /si login *.inc *.config *.ini *.txt *.asp *.aspx *.php *.jsp *.xml *.cgi *.bak
findstr /si user *.inc *.config *.ini *.txt *.asp *.aspx *.php *.jsp *.xml *.cgi *.bak

第一阶段:计算机信息类

毕竟域环境多了一些拿域控,或者kerberos认证等等的东西,就还是分开吧。很多时候盲目的去找一些命令是徒劳无功的,最主要是你要清楚自己要做什么,针对性的作信息收集。这里都是说的手动的,工具类的会放到最后面。

工作组

(1)ip信息(主要判断自己的位置已经确定能横向的方向)

ipconfig /all 网卡信息 
route print 查看路由表 看能到达的地方
arp -a 查看arp表 看缓存
hosts  文件

还有其他的可以自行去做去找,正常情况下这几个命令也够了,wmic ps那些也可以做到,但是没必要,集成的现在太容易被杀了,其他工具也还是靠着平时自己积累。

(2)端口收集(主要是判断开放了哪些端口,和哪些机器连通,有没有后续利用的可能)
netstat-ano //一条就够了,不需要太多的花里胡哨 也可以自己去根据习惯找一些其他的方式。还有一些简化的比如查看特定状态端口根据自己的需要去筛选。findstr命令等实现。

(3)进程收集(主要是看看开启了哪些进程,管理员进程可能涉及提权,杀软进程可能涉及免杀,还有一些第三方的进程可能涉及可以做权限维持,这种都是根据需要去确定的)

tasklist /svc //查看所有进程
tasklist /v //查看进程启动的用户
taskkill /f /PID //关闭某个pid的进程
wmic /namespace:\\root\securitycenter2 path antivirusproduct GET displayName,productState,pathToSignedProductExe //查看本机杀软

对于防火墙配置一类的,我这里没有涉及,是因为特殊情况下才会做。
(4)服务收集(主要是可能涉及一些提权,已经从服务中提取敏感信息比如说抓取密码等,可以通过产品和进程去判断)

wmic product get name,version
tasklist /svc
wmic service list brief //服务信息收集

(5)计划任务 (涉及提权,权限维持等,也可能通过计划任务发现脚本文件中可能存在敏感内容)

schtasks /query

(6)用户收集(主要是对提权或者横向移动做铺垫)

net user 查看用户
net localgroup Administrators 查看管理员组
whoami 当前用户

(7)凭证收集

(1)hash mimikatz
(2)浏览器及第三方软件密码 (利用各种工具或自己写)
(3)wifi密码等
(4)rdp密码

这一块最常用的还是抓hash,肯定首推是mimikatz。不过要做好免杀,免杀的方式就不说了,之前测试一些脚本加载过某0还是没有问题的,现在很久没弄过了不知道了。关于其他的一些比如xshell,浏览器密码抓取的工具,就需要自己平时多收集了,当前有条件的自己写也还是没问题的。还要个人机上一些wifi密码可能也有用,这个就看自己习惯了。

(8)其他收集(主要是一些共享啊之类的)

net share  //查看共享
net use //查看ipc$
systeminfo //查看计算机信息(提权可能会用,也能判断域环境已经操作系统版本)
wmic startup get command,caption 查看自启动
wmic share get name,path,status 查看共享 
net start 查看当前机器启动的服务 
cmdkey /l# 查看保存的凭证

域环境

工作组的环境比较单一,且鉴权都是在本地做,所以没有太多的花里胡哨。域环境可能会麻烦一点,接下来我会从思路上去简述信息收集,争取能够给大家一个比较清晰的脑图,现在我们暂定我们的目标是域控。

(1)当我们拿到一个机器之后,肯定是先判断域环境
(2)确实是域环境以后,要对本机做信息收集
(3)需要判断域控
(4)鉴于有委派或者约束委派这些攻击方式,可能会需要查找一些服务用户,也就是spn相关。
(5)域环境中exchange的权限很高的,有经验的老师傅可能会进来就找邮服,这一块我没有做过,就说一下我自己收集的。
(6)面试的时候会必问的问题,如果寻找域控,如何拿下域控,对于这些方法需要的前提,都是我们必须要进行收集的。

对于本机的收集上面重复的我就不多说了,注意一下下面的点就行了。

(1)ip收集

此时的ip收集我们需要关注一下dns,因为通常情况下,域控可能就是dns服务器。

(2)端口搜集

本机端口收集还是正常的和工作组一样

(3)进程收集

此时的进程收集我们需要留意一下域管启用的进程,如果能够窃取hash,或者直接导出域管hash,基本已经意味着我们有域控权限了。

(4)服务收集

setspn -T domain -q */* //spn收集 后续能利用的太多了,搜索服务用户,搜索域中存在的服务

(5)用户与机器收集

wmic useraccount get /all 查看域用户详情
net user /domain ------> 查询域用户
net group /domain ------> 查询域里面的工作组
net group "domain admins" /domain ------> 查询域管理员用户组
net localgroup administrators /domain ------> 登录本机的域管理员
query user || qwinsta 查看在线用户
net view ------> 查询同一域内机器列表 
net view /domain ------> 查询域列表

(6)凭证收集

和上面一样,只不过这里可以针对权限去分出来从目前的用户看我们有什么权限

(7)其他收集

也是属于捡垃圾了,杂七杂八的收集,没想到,想到了再说。

第二阶段:横向信息收集

经过我们上面各个模块的收集完成后,我们对我们当前计算机的情况已经有所了解了。该提权提权,改拿小本本记录就记录。现在进入第二阶段了,横向移动的收集。横向我分为两种,一种是定向横向,比如我专门打邮服,或者专门打弱口令,只扫描特定端口。还有一种是全方位横向,就是我对所有可达的ip端都进行探测,这种动静就会比较大,但是横向最主要其实也是收集ip和端口了。有web业务打web,有弱口令能ssh或者rdp就试试,ftp能匿名访问也是分,redis未授权可能还能弹回来个shell。这里就八仙过海各显神通了。我这里分为ip和端口进行收集来讨论。
ip类
集成的工具最后再说,先说手动的。
常见的可能是利用脚本或者cmd命令进行收集。这里列举几个

1:ping
for /l %i in (1,1,255) do @ping 172.16.2.%i -w 1 -n 1|find /i "ttl="
2.powershell
1..255 | % {echo "192.168.158.$_"; ping -n 1 -w 100 192.168.158.$_} | Select-String ttl
3.集成脚本
@echo off

rem 内网存活段自动发现脚本 [Windows] 
rem By Klion
rem 2020.7.1

setlocal enabledelayedexpansion

for /l %%i in (0,1,255) do (
  for /l %%k in (0,1,255) do (
    ping -w 1 -n 1 10.%%i.%%k.1 | findstr "TTL=" >nul || ping -w 1 -n 1 10.%%i.%%k.254 | findstr "TTL=" >nul
    if !errorlevel! equ 0 (echo 10.%%i.%%k.0/24 is alive ! >> alive.txt ) else (echo 10.%%i.%%k.0/24 May be sleeping ! )
  )
)

for /l %%s in (16,1,31) do (
  for /l %%d in (0,1,255) do (
    ping -n 1 -w 1 172.%%s.%%d.1  | findstr "TTL=" >nul || ping -w 1 -n 1 172.%%s.%%d.254 | findstr "TTL=" >nul
    if !errorlevel! equ 0 (echo 172.%%s.%%d.0/24 is alive ! >> alive.txt ) else (echo 172.%%s.%%d.0/24 May be sleeping ! )
  )
)

for /l %%t in (0,1,255) do (
  ping -n 1 -w 1 192.168.%%t.1  | findstr "TTL=" >nul || ping -n 1 -w 1 192.168.%%t.254 | findstr "TTL=" >nul
  if !errorlevel! equ 0 (echo 192.168.%%t.0/24 is alive ! >> alive.txt ) else (echo 192.168.%%t.0/24 May be sleeping ! )
)
4.自己利用python等写一些扫描的脚本
5.利用arp,netBios,tcp,udp等协议探测

端口类

1.python
# This script runs on Python 3
import socket, threading

def TCP_connect(ip, port_number, delay, output):
    TCPsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    TCPsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    TCPsock.settimeout(delay)
    try:
        TCPsock.connect((ip, port_number))
        output[port_number] = 'Listening'
    except:
        output[port_number] = ''

def scan_ports(host_ip, delay):

    threads = []        # To run TCP_connect concurrently
    output = {}         # For printing purposes

    # Spawning threads to scan ports
    for i in range(10000):
        t = threading.Thread(target=TCP_connect, args=(host_ip, i, delay, output))
        threads.append(t)

    # Starting threads
    for i in range(10000):
        threads[i].start()

    # Locking the script until all threads complete
    for i in range(10000):
        threads[i].join()

    # Printing listening ports from small to large
    for i in range(10000):
        if output[i] == 'Listening':
            print(str(i) + ': ' + output[i])

def main():
    host_ip = input("Enter host IP: ")
    delay = int(input("How many seconds the socket is going to wait until timeout: "))   
    scan_ports(host_ip, delay)

if __name__ == "__main__":
    main()
2.powershell
24..25 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.168.1.119",$_)) "Port $_ is open!"} 2>$null

24..25 |% {echo "$_ is "; Test-NetConnection -Port $_ -InformationLevel "Quiet" 192.168.1.119}2>null
3.telnet

按照这种思路下来,我们只需要针对我们某个步骤,选择我们理想的方式或者工具去实现,就能收集到很多的信息。而且思路清晰,明确自己下一步需要做什么。

1.用户名枚举(因为kerberos验证的原因,非域情况下能够枚举域用户,原理自己可以看一下,这里我没有能力自己写工具,就放一些工具链接)
msf:auxiliary/gather/kerberos_enumusers
nmap:Nmap –p 88 –script-args krb5-enum-users.realm=’[domain]’,userdb=[user list] [DC IP]
kerbrute:kerbrute_windows_amd64.exe userenum --dc ip -d 域名 user.txt
DomainPasswordSpray:
Get-DomainUserList -Domain 域名 -RemoveDisabled -RemovePotentialLockouts | Out-File -Encoding ascii userlist.txt
2.密码喷射
kerbrute:kerbrute_windows_amd64.exe passwordspray --dc ip -d 域名 user.txt 密码
nvoke-DomainPasswordSpray -Domain 域名 -UserList .\userlist.txt -Password '密码

3.查找域控
nltest /DCLIST:GOD  查域控
Nslookup -type=SRV _ldap._tcp 查看域控主机名
net group “Domain Controllers” /domain 查看域控组内域控主机
net group “Domain Controllers” /domain 查看域控列表
net time /domain
nltest /dclist:[域名] 查看域控机器名
dsquery server 得到域控制器的IP
netdom query pdc
ipconfig /all 查看dns
扫描139等不常见但域控会开启的端口

4.获取域控的方法(这里不说钓鱼欺骗类的这种,中继后续都开了SMB签名也不说吧)
(1).抓域管密码横向
(2).通过域管进程横向
(3)利用已知漏洞(打印机,14068,zerologon等)
(4)委派攻击
(5)利用第三方软件如邮服等
(6)组策略做密码复用
(7)金银票据(主要用来做维权的,多学点没错,也写在这里吧)

5.判断域环境
 net time /domain
 ipconfig /all
 systeminfo 
 net config workstation

工具
用户
用户爆破
https://github.com/ropnop/kerbrute
用户枚举
https://github.com/chrisdee/Tools/tree/master/AD/ADFindUsersLoggedOn
https://github.com/mubix/netview/
获取服务用户
kerberoast
GetUserSPNs.ps1
ip
(1)nbtscan.exe
(2)arpscan.exe
(3)ServerScan https://github.com/Adminisme/ServerScan
(4)msf模块
auxiliary/scanner/discovery/arp_sweep
auxiliary/scanner/discovery/udp_sweep
auxiliary/scanner/discovery/udp_probe
auxiliary/scanner/netbios/nbname
端口
端口爆破
PortBrute https://github.com/awake1t/PortBrute
服务
MSF
auxiliary/scanner/smb/smb_version
auxiliary/scanner/ftp/ftp_version 发现ftp
auxiliary/scanner/ssh/ssh_version 发现ssh
auxiliary/scanner/telnet/telnet_version 发现telnet
auxiliary/scanner/mysql/mysql_version 发现mysql
密码爆破
https://github.com/fireeye/gocrack
https://github.com/dafthack/DomainPasswordSpray
web扫描
https://github.com/broken5/bscan
https://github.com/phantom0301/PTscan

域与非域集合工具
(1)Seatbelt.exe
Seatbelt.exe -group=user -full 运行普通用户权限检查的模块 -full返回输出
Seatbelt.exe -group=all 运行所有模块(需要管理员权限)
Seatbelt.exe -group=system #运行检查系统相关的信息
Seatbelt.exe -group=misc #运行所有其他检查(包括浏览器记录)
Seatbelt.exe -group=chrome 运行浏览器历史等模块
(2)BloodHound
https://github.com/BloodHoundAD/BloodHound/releases
(3)WinPwn
https://github.com/S3cur3Th1sSh1t/WinPwn/
(4)domainTools
https://github.com/SkewwG/domainTools
(5)Rubeus.exe
https://github.com/GhostPack/Rubeus
(6)powerview && powersploit
(7)fscan
https://github.com/shadow1ng/fscan
集合脚本

(1)wmic
for /f "delims=" %%A in ('dir /s /b %WINDIR%\system32\*htable.xsl') do set "var=%%A"
wmic process get CSName,Description,ExecutablePath,ProcessId /format:"%var%" >> out.html
wmic service get Caption,Name,PathName,ServiceType,Started,StartMode,StartName /format:"%var%" >> out.html
wmic USERACCOUNT list full /format:"%var%" >> out.html
wmic group list full /format:"%var%" >> out.html
wmic nicconfig where IPEnabled='true' get Caption,DefaultIPGateway,Description,DHCPEnabled,DHCPServer,IPAddress,IPSubnet,MACAddress /format:"%var%" >> out.html
wmic volume get Label,DeviceID,DriveLetter,FileSystem,Capacity,FreeSpace /format:"%var%" >> out.html
wmic netuse list full /format:"%var%" >> out.html
wmic qfe get Caption,Description,HotFixID,InstalledOn /format:"%var%" >> out.html
wmic startup get Caption,Command,Location,User /format:"%var%" >> out.html
wmic PRODUCT get Description,InstallDate,InstallLocation,PackageCache,Vendor,Version /format:"%var%" >> out.html
wmic os get name,version,InstallDate,LastBootUpTime,LocalDateTime,Manufacturer,RegisteredUser,ServicePackMajorVersion,SystemDirectory /format:"%var%" >> out.html
wmic Timezone get DaylightName,Description,StandardName /format:"%var%" >> out.html

(2)powershell
Function Get-InstalledSoftware{
    <#
    .SYNOPSIS
    Gets a computers Name, Operating System,OS Architecture and all installed Software Name,Version and IdentifyingNumber.
    Returns it all in a powershell object.
    .EXAMPLE
    Get-InstalledSoftware -computername localhost
    .EXAMPLE
    Get-InstalledSoftware -computername comp1,comp2,comp3
    .EXAMPLE
    Get-Content computers.txt | Get-InstalledSoftware | Export-Csv C:\SoftwareReport.csv
    .PARAMETER computername
    One or more computer names seperated by comma.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string[]]$ComputerName
    )
    BEGIN{
    }
    PROCESS 
    {
        foreach($computer in $ComputerName){

            try {

            $software = Get-WmiObject -Class Win32_Product -ComputerName $ComputerName -ErrorAction Stop

            } catch {

                Write-Host "$computer Offline"
            }

            $os = Get-WMIObject -Class win32_operatingsystem -ComputerName $ComputerName
            $osname = ($os.Name).Split("|") | Select-Object -First 1     

                foreach($installed in $software){

                    $props = [ordered] @{
                        'ComputerName' = $os.PSComputerName;
                        'OperatingSystem' = $osname;
                        'Archtecture' = $os.OSArchitecture;
                        'Name' = $installed.Name;
                        'Version' = $installed.Version;
                        'Vendor' = $installed.Vendor;
                        'IdentifyingNumber' = $installed.IdentifyingNumber}          

                    $obj = New-Object -TypeName psobject -Property $props
                    Write-Output $obj

                }

            }
        }
    END{
    }
}

本来还想找找其他工具的,又懒得找了,自动化方便是一回事,必然会带来弊端。动静大,易查杀等。脚本小子终究只是一时爽。最后还是要自己走安全开发自己写工具,在特定的环境下能实现功能才行。就难得总结工具了,多培养培养思维多学习学习底层还是长久之道。
这篇文章只是抛砖引玉给大家提供一个思路,还有很多东西没用收到。但是信息收集和漏洞利用总是相依相存的。比如委派,邮服这些。或者是需要一些漏洞利用链的时候。扩大自己的攻击技术和攻击面,了解新的攻击方式应该是最重要的,可能一条路不同我换了一种攻击方式,搜集一下需要实现的前置条件都满足,自然也就打下来了。随机应变。有些工具是之前收集的说实话都没有用上过,所以工具在精在顺手不在多。选择合适自己的才最重要。

点击收藏 | 7 关注 | 2
  • 动动手指,沙发就是你的了!
登录 后跟帖