登录后台

页面导航

本文编写于 193 天前,最后修改于 26 天前,其中某些信息可能已经过时。

image-20220323121608774

外网打点:

一般比较重要的:RCE/反序列化漏洞/文件上传getshell/缓冲区溢出getshell/钓鱼拿shell/ms-17-010,这些一般都能拿到shell

image-20220323221108041

弱口令

yyds

各种数据库、登录界面、SSH、telnet、RDP、redis、VPN

数据库弱口令进去写shell

登录界面弱口令进去找功能点(文件上传、文件读取、文件包含等)

SSH、telnet、RDP这种弱口令只要连进去基本上就是一个shell了

redis弱口令进去可以写shh秘钥,然后ssh登录

VPN弱口令进去可以开隧道、代理直接进内网

爆破字典

https://github.com/TheKingOfDuck/fuzzDicts

https://github.com/fuzz-security/SuperWordlist

https://github.com/insightglacier/Dictionary-Of-Pentesting

https://github.com/Stardustsky/SaiDict

https://github.com/huyuanzhi2/password_brute_dictionary

https://github.com/k8gege/PasswordDic

https://github.com/ybdt/dict-hub

day

常见漏洞库

https://www.cnvd.org.cn/flaw/list.htm?flag=true

https://avd.aliyun.com/nonvd/list

https://nox.qianxin.com/vulnerability

https://www.exploit-db.com/

还有各种各样下载下来的漏洞库

利用0day、1day、nday漏洞是最常见的攻击方式

JAVA中间件

struts2系列

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

https://www.freebuf.com/vuls/246969.html

weblogic

CVE-2014-4210 : SSRF漏洞探测内网

CVE-2015-4852 : 反序列化漏洞

CVE-2016-3510 : 反序列化漏洞

CVE-2016-0638 : 反序列化漏洞

CVE-2017-3248 : 反序列化漏洞

CVE-2017-10271 : XMLDecoder反序列化漏洞

CVE-2017-3506 : XMLDecoder反序列化漏洞

CVE-2018-2894 : 任意文件上传漏洞

CVE-2018-2893 : WLS核心组件反序列化漏洞

CVE-2018-2628 : 反序列化远程代码执行漏洞

CVE-2018-3191 : 远程代码执行漏洞

CVE-2019-2729 : 反序列化漏洞

CVE-2019-2725

Jboss

CVE-2015-7501 : JBoss JMXInvokerServlet 反序列化漏洞

CVE-2017-7504 : Jboss反序列化漏洞

CVE-2017-12149 : 反序列化漏洞

Jekins

未授权访问、RCE、任意文件读取

jekins漏洞合集 : https://blog.csdn.net/whatday/article/details/106544050

Tomcat

弱口令,部署war包

ElasticSearch

ElasticSearch漏洞合集 : https://blog.csdn.net/sojrs_sec/article/details/103780988

RabbitMQ

弱口令 guest/guest

Glassfish

任意文件读取、后台getshell

https://blog.csdn.net/weixin_44033675/article/details/121316067

IBM Websphere

RCE、XXE

XXE : https://zhuanlan.zhihu.com/p/260021756

弱口令,布置webshell

Axis2

弱口令 admin/axis2

任意文件读取

目录遍历

Apache ActiveMQ

任意文件写入

https://www.cnblogs.com/yuzly/p/11278131.html

Apache Solr

RCE、XXE、文件上传、SSRF

https://blog.csdn.net/yangbz123/article/details/117827547

Apache Zookeeper

信息泄露

任意文件读取

shiro反序列化

shrio 550反序列化漏洞

shiro 721反序列化漏洞

身份验证绕过 : URL中加 ;

fastjson

反序列化漏洞 <=1.2.47

https://github.com/wyzxxz/jndi_tool

CMS等开源程序(弱口令、Nday)

帝国CMS、DedeCMS、phpmyadmin、wordpress、thinkphp

thinkphp : https://blog.csdn.net/yangbz123/article/details/115329314

OA等平台(Nday)

泛微OA、致远OA、用友NC

致远 : https://www.cnblogs.com/AtesetEnginner/p/12106741.html

组件

log4j、log4j2、IIS

log4j

https://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247496255&idx=1&sn=acb66f2fd28859868892e028ac64d586&chksm=ec1dc217db6a4b018fd347ace7287631eaf3130

IIS

解析漏洞、PUT任意文件写入

https://blog.csdn.net/weixin_42918771/article/details/105178309

IOT终端设备(弱口令、Nday)

路由器、摄像头等终端设备

固件漏洞(缓冲区溢出、UAF、竞争漏洞、环境变量)

web漏洞(弱口令、RCE、XSS)

协议漏洞

APP漏洞

安全设备、VPN(弱口令、Nday)

防火墙、EDR、VPN

常见默认密码

基础服务端口

服务默认端口利用手法
FTP21弱口令、匿名访问、信息泄露
SSH22弱口令、远程执行、后门植入
TELNET23弱口令、后门植入
SMTP25用户枚举、弱口令、信息泄露
POP3110信息泄露、弱口令
WMI135弱口令、远程命令执行、后门植入
SMB139/445溢出漏洞(永恒之蓝)、IPC$、弱口令
MSSQL1433弱口令、信息泄露、提权、远程命令执行
MYSQL3306弱口令、信息泄露、提权
ORACLE1521弱口令、提权、远程命令执行
POSTGRESQL5432弱口令、敏感信息泄露
MONGODB27017弱口令、未授权
VNC5900弱口令
REDIS6379弱口令、未授权、提权、写文件

社工钓鱼

免杀、邮件钓鱼、xss钓鱼

前期做好信息收集,目标单位邮箱、企业架构、IT人员

wx小号调运维....

各种木马文件

宏木马、捆绑、exe、lnk、自解压

漏扫

goby、awvs、appscan、xray、灯塔、玲珑

goby普通版主要是资产梳理,普通版内置的POC很少

awvs内置的POC多,可以拿来扫Nday

appscan和awvs差不多

xray扫信息泄露和xss效果很好,但是进了后台不推荐使用,因为会到处插payload

灯塔、玲珑就比较综合了,资产梳理到扫漏洞

权限提升

windows

使用EXP

systeminfo查看windows系统的版本以及补丁情况,或者使用一些工具查询,然后找相应的EXP打

检测系统的补丁情况:

https://github.com/SecWiki/windows-kernel-exploits/tree/master/win-exp-suggester

查看补丁:

https://github.com/chroblert/WindowsVulnScan

内核提权EXP:

https://github.com/SecWiki/windows-kernel-exploits

在线的提权利用查询:

https://lolbas-project.github.io/

通过补丁查询对应可能可以使用的EXP:

http://bugs.hacking8.com/tiquan/

像比较常用的漏洞:

MS14-058    [KB3000061]  win32k.sys的特权提升漏洞
MS14-068    [KB3011780]
MS15-051    [KB3045171]
MS15-077    [KB3077657]
MS16-032    [KB3124280]
MS16-075    烂土豆提权,只针对本地,不能用于域用户
MS16-135    [KB3199135]
MS17-010    [KB4013389]
CVE-2019-0708
CVE-2019-0803
CVE-2019-1322
CVE-2019-12750
CVE-2020-0787

windows特性提权

系统服务权限配置错误

利用高权限的含有漏洞的服务

不带引号的服务路径提权

"C:Program FilesBOY.exe",有双引号时,执行 BOY.exe 文件

C:Program FilesBOY.exe,没有双引号时,执行Program.exe文件

注册键AlwaysInstallElevated

如果启用 允许低权限用户以System权限安装文件 该策略,则任意用户都可以以system权限安装恶意程序

自动安装配置文件提权

在内网中可能会有一些批量执行命令的脚本,里面可能会有一些配置信息甚至账号密码

DLL提权

劫持DLL进行提权

DLL加载顺序:
应用程序加载的目录
C:\Windows\System32
C:\Windows\System
C:\Windows
当前工作目录Current Working Directory,CWD
在PATH环境变量的目录(先系统后用户)

第三方组件提权(hvv面试好像经常问)

sqlservser提权

在sqlserver里面使用sa用户运行提权脚本执行命令

Exec sp_configure 'show advanced options',1;RECONFIGURE;exec sp_configure 'Ad Hoc Distributed Queries',1;RECONFIGURE;
Exec master.dbo.xp_cmdshell 'net user lx 123456 /add & net localgroup administrators lx /add'
Exec master.dbo.xp_cmdshell 'systeminfo'
udf提权

用户自定义函数提权

mysql5.1之后需要把提权的dll文件放到插件目录下

mof提权

mof是windows内的一个文件,会监控进程的创建和死亡

当我们有了一个mysql的root用户之后,去执行我们上传的mof文件,在mof文件中有创建用户的命令,以达到提权

G6FTP提权

默认开放在本地的8021端口

将创建用户的将用户添加到管理员组的命令脚本用ftp上传并执行以达到提权

bypass-uac

uac(用户账户控制)

白名单提权

COM接口

计划任务

DLL劫持

一些自身漏洞

https://github.com/hfiref0x/UACME

linux

内核漏洞

CVE-2016-5159(dity-cow 脏牛)

dity-pipe

pkexec提权,这个是linux下的一个组件的漏洞,因为影响挺大的,我也把它放这了

https://github.com/SecWiki/linux-kernel-exploits

SUID提权

查找有suid的文件
• find / -perm -u=s -type f 2>/dev/null
• find / -user root -perm -4000-print2>/dev/null
• find / -user root -perm -4000-exec ls -ldb {} \;

常见文件:nmap、vim、find、more、less、bash、cp、Nano、mv、awk、man、weget

SUDO提权

在/etc/souders文件内,如果有bypass ALL=(ALL:ALL) NOPASSWD:ALL这句话则使用sudo无需密码

https://gtfobins.github.io/

计划任务提权

一些管理定时执行任务的文件,若它是以root权限执行任务,而普通用户又可以写,那么就可以往这些文件里面写入一些反弹shell的命令

第三方

第三方以root权限运行的程序或组件存在漏洞

SSH秘钥提权

到.ssh目录下,把id_rsa下载到本地设置权限 600 然后利用秘钥登录

cat /etc/passwd | grep bash
cd /home/web1/.ssh
chmod 600 id_rsa    # 设置权限
ssh -i id_rsa web1@192.0.0.1    # 利用秘钥登录

passwd提权

当 /etc/passwd 文件普通用户可写时,可以修改里面的root密码

环境变量劫持

也是利用suid文件提权,suid文件得有系统命令

cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH export PATH=/tmp:$PATH
cd /script
./shell

john破解root密码

暴力破解root密码

udf提权(成功率不大)

在mysql内创建函数进行提权

权限维持

web

内存马

不死马

iis后门

winows权限维持

映像劫持技术

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image FileExecution Options 内创建一个BOY.exe,然后在右侧新建一个Debugger,里面写入后门地址

策略组脚本权限维持

打开组策略,里面的windows设置里有个脚本(启动/关机),设置启动属性,添加后门脚本路径

粘贴键后门

C:\windows\system32\sethc.exe替换为后门程序,连续按5次shift键调用程序

影子账号

net user BOY$ 123456 add

文件隐藏

Attrib +s +a +h +r BOY.exe

注册表运行键
屏幕保护程序

修改注册表或者使用msf里面的模块

修改快捷方式

修改快捷方式,link到后门文件

PowerShell配置文件

向powershell配置文件写入自定义语句

查看是否存在配置文件:
echo $profile
Test-path $profile
创建配置文件:
New-Item -Path $profile -Type File –Force
利用:
创建脚本文件
$string = 'Start-Process "C:\BOY.bat"'
$string | Out-File -FilePath $profile -Append
辅助功能

利用屏幕键盘、放大镜、屏幕阅读等辅助功能,将其修改为后门,和粘贴键后门类似

Netsh Helper DLL

利用hetsh加载恶意DLL

新服务

在cmd或者powershell里创建新服务

安全支持提供程序

安全支持提供程序(SSP)是windows内的一个API,可以注册SSP DLL然后加载到内存以达到持久化

BITS Jobs
端口监视器
计划任务

写计划任务,不断反弹shell

时间服务器

linux权限维持

添加用户

直接添加用户

修改passwd文件

锁定文件
chattr +i evil.php #锁定文件
rm -rf evil.php #提示禁止删除
lsattr evil.php #属性查看
chattr -i evil.php #解除锁定
rm -rf evil.php #彻底删除文件
SUID后门
cp /bin/bash /tmp/.BOY     # 将/bin/sh放到tmp目录下
chmod 4755 /tmp/.BOY        # 赋予SUID权限
/tmp/.BOY                    # 运行可以拿到一个root的shell
SSH后门

添加公钥,下次用公钥登录

ssh-keygen -t rsa //生成公钥
cat id_rsa.pub > authorized_keys //将id_rsa.pub放到.ssh/authorized_keys里面

SSH软连接后门 :

http://blackwolfsec.cc/2017/03/24/Linux_ssh_backdoor/

计划任务

在计划任务的文件里面写入反弹shell,隔段时间就反弹shell

第三方后门

vim后门

inetd服务后门

协议后门:ICMP/DNS

rookit

内网渗透思路:

通过外网撕开的口子,定位域控的IP及域管理员的账号,因为域管理员可以登录任何成员机子,可以找域管登陆过的机子,然后dump出域管密码,进而拿下域控

域内信息收集

域内收集信息的命令

net:

net user       #  本机用户列表
net localgroup administrators       #  本机管理员[通常含有域用户]
net user /domain       #  查询域用户
net group /domain       #  查询域里面的工作组
net group "domain admins" /domain       #  查询域管理员用户组
net localgroup administrators /domain       #  登录本机的域管理员
net localgroup administrators workgroup\user001 /add ----->域用户添加到本机
net group "Domain controllers" -      #  查看域控制器(如果有多台)
net view       #  查询同一域内机器列表 net view /domain       #  查询域列表
net view /domain:domainname

dsquery:

dsquery computer domainroot -limit 65535 && net group "domain computers" /domain       #  列出该域内所有机器名
dsquery user domainroot -limit 65535 && net user /domain     # 列出该域内所有用户名
dsquery subnet       # 列出该域内网段划分
dsquery group && net group /domain       # 列出该域内分组
dsquery ou       # 列出该域内组织单位
dsquery server && net time /domain        # 列出该域内域控制器

else:

ifconfig /all    # 查看网络配置
systeminfo
tasklist /svc    # 查看服务列表
netstat -ano    # 查看端口开放情况

常用工具收集信息

nmap

建立socks代理,扫描内网

-sT: TCP 扫描
-sS: SYN 扫描
-sA: ACK 扫描
-sF:FIN 扫描
-sU: UDP 扫描
-sR: RPC 扫描
-sP: ICMP 扫描
msf
主机存活探测:
auxiliary/scanner/discovery/arp_sweep     # ARP 扫描
auxiliary/scanner/discovery/udp_sweep    # UDP 扫描
auxiliary/scanner/netbios/nbname         # NETBIOS 扫描
auxiliary/scanner/snmp/snmp_enum         # 扫描
auxiliary/scanner/smb/smb_version         # SMB 扫描
端口扫描:
auxiliary/scanner/portscan/ack             # TCP ACK 端口扫描
auxiliary/scanner/portscan/ftpbounce     # FTP bounce 端口扫描
auxiliary/scanner/portscan/syn             # SYN 端口扫描
auxiliary/scanner/portscan/tcp             # TCP 端口扫描
auxiliary/scanner/portscan/xmas         # TCP XMas 端口扫描
msscan

快速扫描端口

收集本地机子各种密码

windows当前用户密码:

mimikatz : https://github.com/gentilkiwi/mimikatz 可以配合一些windows白名单把lass.exe内的密码dump下来然后本地破解密码

浏览器内各种密码

窃取浏览器cookie : https://github.com/DeEpinGh0st/Browser-cookie-steal

导出浏览器数据 : https://github.com/moonD4rk/HackBrowserData

xshell/xftp密码

解密xshell/xftp密码 : https://github.com/dzxs/Xdecrypt

navicat

https://blog.csdn.net/CCESARE/article/details/104746596

分析域内架构

DMZ

管理网

生产网

测试网

横向渗透

SYSVOL

sysvol是指存储公共服务器副本的共享文件,在域中的域控之间复制,用来存放GPO、script等信息

可以查找SYSVOL或者组策略首选项中保存的密码

MS14-068

kerberos协议漏洞

PAC是验证client的访问权限的,被放在TGT里发给client,然后由client发给TGS

kdcsvc.dll域控制器的秘钥分发中心(KDC)存在一个漏洞,允许经过身份认证的用户在其获得的票据TGT中插入任意PAC,普通用户可以拿改变了PAC的TGT来伪造票据获取管理员权限

黄金票据

在windows的kerberos认证的过程中,client将信息发送给KDC,然后KDC把krbtgt用户的NTLM-Hash作为秘钥进行加密,生成TGT,如果我们拿到了jrbtgt用户的NTLM-Hash,就可以伪造TGT,前提是得拿到jrbtgt用户的NTLM-Hash,而该用户只有域控制器上面才有

所需条件:
域名称
域SID值
域的jrbtgt账户的HASH
伪造任意用户名

银票据

银票据的利用是伪造TGS,通过已知的授权服务密码生成可以访问该服务的TGT,在生成过程中不需要使用KDC,因此可以绕过域控制器,白银票据依赖于服务账号的密码散列值,相对于黄金票据更加隐蔽

PTH

直接通过nt hash或者ntlm hash访问远程主机,可以使用mimitkaz或者psexec进行hash传递

  • mimitkaz:
privilege::debug
sekurlsa::logonpasswords
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"> password.txt

privilege::debug
sekurlsa::pth /user:administrator /domain:workgroup /ntlm:xxxxxxxxxxxxxxxxx
  • psexec:
注意点:
需要远程系统开启admin$共享
需要目标开启445端口
非域用户无法利用内存中的票据使用psexec功能,只能用账号密码传递

域服务账号破解

在mimikatz提取的门票,用rgsrepcrack破解

密码喷洒

和爆破类似,只不过是用固定的密码去爆破用户名,这样可以增加爆破的成功率,清除账户被锁定的概率

CVE-2021-42278 && CVE-2021-42287

https://github.com/cube0x0/noPac

ZeroLogon(CVE-2020-1472)

该漏洞可将域控用户的密码置空

委派攻击

域委派是指把域内用户的权限委派给服务账号,就好比你访问了我,然后我拿着你访问我的凭证去访问别的机子,委派攻击分为非约束委派攻击、约束委派攻击和资源委派攻击

非约束委派

当用户访问某个机子的时候会向dc发起认证,dc会检查该机子的账号的属性,如果是非约束委派,会吧用户的TGT放在ST票据中一起发送给那台要访问的机子,然后那台机子就会把用户的TGT储存在自己的lsass中,那么该怎么利用呢,我们如果拿下了一台配置了非约束委派的机子,可以诱导管理员访问该机子,然后就拿到了管理员的TGT,就可以模拟管理员访问任意服务了

可以配合spooler打印机服务由被动转换为主动

获取票据:
privilege::debug sekurlsa::tickets /export sekurlsa::tickets /export
Rubeus dump /service:krbtgt /nowrap
Rubeus dump /luid:0xdeadbeef /nowrap
查找非约束委派的机子:
Get-NetComputer -Unconstrained
Get-DomainComputer -Unconstrained -Properties DnsHostName
MATCH (c:Computer {unconstraineddelegation:true}) RETURN c
MATCH (u:User {owned:true}), (c:Computer {unconstraineddelegation:true}), p=shortestPath((u)-[*1..]->(c)) RETURN p
约束委派

由于非约束委派的不安全性,引入了约束委派

当用户访问机子1的时候,会向dc发起kerberos认证,然后域控返回用户的TGT和ST1票据,用户使用ST1票据对机子1进行访问,如果配置了机子1到机子2的约束委派,则机子1可以使用S4U2Proxy协议将用户发给自己的ST1票据以用户的身份发给dc,最后域控就返回一个访问机子2的ST2票据给机子1,这样机子1就能以用户身份访问机子2了

获取票据:
privilege::debug sekurlsa::tickets /export sekurlsa::tickets /
Rubeus dump /service:krbtgt /nowrap
Rubeus dump /luid:0xdeadbeef /nowrap
查找约束委派的机子:
Get-DomainComputer -TrustedToAuth -Properties DnsHostName, MSDS- AllowedToDelegateTo
MATCH (c:Computer), (t:Computer), p=((c)-[:AllowedToDelegate]->(t)) RETURN p
MATCH (u:User {owned:true}), (c:Computer {name: "<MYTARGET.FQDN>"}), p=shortestPath((u)-[*1..]->(c)) RETURN p

[TOC]

样本分析常用工具

文件检测

file命令:linux下的一个命令,用来查看文件类型

PEID:一个强大的查壳脱壳工具

DIE:和PEID类似,也是一个查课脱壳工具

文件编辑

010edit:文本/十六进制编辑器

binwalk:固件分析工具

行为监控

ProcessMonitor:系统进程监视软件

火绒剑:强大的行为监视软件

wireshark:网络监视软件

静态分析

ApkTool:反编译APK文件的工具

Dex2jar:反编译java的工具

jd-gui:可用来查看java源代码

IDA:强大的反编译软件

Dnspy:针对与.NET的逆向工具

动态分析

OllyDbg:动态调试软件,支持多个插件,但是不支持64位程序的调试

x64/x32dbg:动态调试软件,支持32位和64位下的动态调试

windbg:支持windows内核调试

恶意样本常用API

文件类

Kernal32

CreateFile()        // 打开创建对象,返回句柄
CreateFileMapping()    // 创建一个新的文件映射内核对象
OpenFile()        // 打开文件
FindFirstFile()        // 到一个文件夹下搜索指定文件
FindNextFile()        // 遍历目录或文件,判断当前目录下是否有下一个目录或文件
GetModuleFileName()    // 获取当前进程已加载模块的完整路径,模块必须由当前进程加载
GetModeleHandle()    // 获取一个应用程序或动态链接库的模块句柄
GetProcAddress()    // 检索指定的动态链接库中的输出库函数的地址
GetStartupInfo()    // 取得进程在启动时被指定的 STARTUPINFO 结构
GetTempPathO()        // 获取为临时文件指定的路径
GetWindowsDirectory()        // 获取Windows目录的完整路径名
MapViewOfFile()        // 将一个文件映射对象映射到当前应用程序的地址空间
SetFileTime()    // 设置文件的创建、访问及上次修改时间
Wow64DisableWow64FsRedirection()        // 禁用文件系统重定向机制

NtosKrnl

NtQueryDirectoryFile()        // 返回多种指定的文件信息

网络类

ws2_32

socket()        // 用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源
accept()        // 用来监听入站网络连接
bind()            // 将一本地地址与一套接口捆绑
connect()        // 用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址
gethostbyname()    // 获取主机名,返回hostent结构指针
gethostname()    // 返回本地主机的标准主机名
inet_addr()        // 将一个点分十进制的IP转换成一个长整数型数
recv()        // 从已连接的socket中接收数据
send()        // 向一个已连接的socket中发送数据
WSAStartup()        // 初始化底层级别的网络函数

wininet

InternetOpenA()    // 初始化一个应用程序,以使用 WinINet 函数
InternetOpen()    // 初始化一个应用程序,以使用 WinINet 函数
InternetOpenUrl()    // 通过一个完整的FTP,Gopher或HTTP网址打开一个资源
InternetReadFile()    // 从一个由InternetOpenUrl,FtpOpenFile, 或HttpOpenRequest函数打开的句柄中读取数据
InternetWriteFile()    // 向服务器上传文件

ole32

CoCreateInstance()    // 用指定的类标识符创建一个Com对象,用指定的类标识符创建一个未初始化的对象
OleInitialize()        // 在当前单元(apartment)初始化组件对象模型(COM)库,将当前的并发模式标识为STA(single-thread apartment——单线程单元),并启用一些特别用于OLE技术的额外功能

wininet

FtpPutFile()    // 将本地文件上传到FTP服务器

Iphlpapi

GetAdaptersInfo()    // 获取网卡信息

Netapi32

NetShareEnum()        // 返回服务器上共享的资源的信息

urlmon

URLDownloadToFile()        // 从指定URL地址读取内容并将读取到的内容保存到特定的文件里

注册表与服务类

advapi32

CreateService()        // 创建一个服务对象,并将其添加到指定的服务控制管理器数据库
ControlService()    // 向服务发送一个控制码
OpenSCManager()        // 建立了一个到服务控制管理器的连接,并打开指定的数据库
RegOpenKey()        // 打开给定键
StartServiceCtrlDispatcher()    // 将服务进程的主线程连接到服务控制管理器
RegCloseKey()        // 释放指定注册键的句柄
RegCreateKey()        // 创建或打开注册表项
RegCreateKeyEx()    // 创建指定的注册键
RegDeleteKey()        // 删除一个注册表键值
RegOpenKey()        // 打开给定键
RegOpenKeyEx()        // 打开一个指定的注册表键
RegDeleteValue()    // 删除一个键下的一个键值
RegQueryValue()        // 取得指定项或子项的默认(未命名)值
RegSetValue()        // 设置指定注册表项的默认值或未命名值的数据
RegSetValueEx()        // 设置指定值的数据和类型
RegQueryInfoKey()    // 获取与一个项有关的信息
RegEnumKey()        // 获取指定的子键值
RegEnumKeyEx()        // 枚举指定项下方的子项
RegEnumValue()        // 枚举指定项的值
RegLoadKey()        // 从以前用RegSaveKey函数创建的一个文件里装载注册表信息
RegReplaceKey()        // 用一个磁盘文件保存的信息替换注册表信息;并创建一个备份,在其中包含当前注册表信息
RegRestoreKey()        // 从一个磁盘文件恢复注册表信息
RegSaveKey()        // 将一个项以及它的所有子项都保存到一个磁盘文件
RegConnectRegistry()    // 访问远程系统的部分注册表
RegNotifyChangeKeyValue()    // 应用程序可以接收事件通知中指定的注册表项及其子项的更改
RegUnloadKey()        // 卸载指定的项以及它的所有子项

user32

RegisterHotKey()    // 定义一个系统范围的热键

进程线程类

user32

AttachThreadInput()    // 把一个线程的输入消息连接到另外的线程

kernel32

CheckRemoteDebuggerPresent() // 检查一个特定进程是否被调试。这个函数通常在一个反调试技术中被使用
ConnectNamedPipe()    // 指示一台服务器等待下去,直至客户机同一个命名管道连接
CreateProcess()        // 创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件
CreateRemoteThread()    // 创建一个在其它进程地址空间中运行的线程(也称:创建远程线程)
CreateToolhelp32Snapshot()        // 通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照
EnumProcesses()        // 检索进程标识符
EnumProcessModules()        // 枚举进程模块
IsWow64Process()        // 确定指定进程是否运行在64位操作系统的32环境(Wow64)下
OpenProcess()        // 打开一个已存在的进程对象,并返回进程的句柄
PeekNamedPipe()        // 预览一个管道中的数据,或取得与管道中的数据有关的信息
Process32First()    // 获取进程的句柄
Process32Next()        // 获取下一个进程的句柄
ReadProcessMemory()    // 根据进程句柄读入该进程的某个内存空间
ResumeThread()        // 恢复挂起的线程
SetThreadContext()    // 修改给定线程的上下文
SuspendThread()        // 暂停指定的线程
Thread32First()        // 返回进程中第一个线程的信息
Thread32Next()        // 返回进程中下一个线程的信息
WinExec()        // 运行指定的程序
WriteProcessMemory()    // 写入某一进程的内存区域

ntdll

ZwQueryInformationProcess()        // 返回特定进程的信息

shell32

ShellExecute()        // 运行一个外部程序,并有一定的控制

Rpccrt4

RpcServrRegisterIf()    // 注册与RPC运行时库的接口
RpcServerListen()        // 指示RPC运行时库来监听远程过程调用
RpcServerUseProtseqEp()        // 告诉RPC运行时库使用指定的协议序列与指定的端点组合来接收远程过程调用
RpcMgmtStopServerListening()        // 告诉服务端停止对RPC的监听
RpcServerUnregisterIf()        // 从RPC运行时库注册表中删除一个接口
RpcStringBindingCompose()    // 创建一个字符串绑定句柄
RpcBindingFromStringBinding()    // 从绑定句柄的字符串表示中返回绑定句柄
RpcStringFree()        // 释放由RPC运行库分配的字符串
RpcExceptionCode()        // 回一个code,标识异常出现的类型

注入类

kernel32

GetThreadContext()        // 获取目标线程的上下文
QueueUserAPC()        // 把一个APC对象加入到指定线程的APC队列中
VirtualAllocEx()    // 在指定进程的虚拟空间保留或提交内存区域,除非指定MEM_RESET参数,否则将该内存区域置0
VirtualProtectEx()        // 改变在特定进程中内存区域的保护属性

驱动类

kernel32

DeviceIoControl()    // 直接发送控制代码到指定的设备驱动程序,使相应的移动设备以执行相应的操作

secur32

LsaEnumerateLogonSessions()        // 枚举当前系统上的登录会话

ntoskrnl

MmGetSystemRoutineAddress()        // 返回特定函数的地址

加密与解密

Advapi32

// csp是微软提供的加密服务应用接口
CryptAcquireContext()        // 获取有某个容器的CSP模块的指针
CryptReleaseContext()        // 释放CSP句柄
CryptEnumProviders()        // 此函数得到第一个或下一个可用的CSP。如果使用循环,就可以得到计算机上所有可用的CSP
CryptCreateHash()        // 此函数初始化哈希数据流
CryptGetHashParam()        // 得到指定哈希对象的数据
CryptDestroyHash()        // 此函数销毁由hHash指定的哈希对象
CryptHashData()        // 添加数据到hash对象
CryptDeriveKey()        // 此函数从一基本数据值中派生会话密钥
CryptGetProvParam()        // 此函数获得CSP的各种参数
CryptSetKeyParam()        // 自定义会话密钥各方面的操作
CryptEncrypt()        // 此函数用于加密数据
CryptDecrypt()        // 此函数对由CryptEncrypt加密过的数据进行解密
CryptDestroyKey()        // 此函数释放密钥句柄
CryptGenKey()        // 生成一个密钥
CryptGetUserKey()    // 获取用户的公钥/私钥对其中一个的句柄
CryptContextAddRef()        // 增加CSP的引用计数器的数值
CryptReleaseContext()        // 释放CSP句柄
CryptExportKey()        // 

消息传递

User32

SendMessage()        // 将指定的消息发送到一个或多个窗口
SendMessageCallback()        // 将指定的消息发送到一个或多个窗口,此函数为指定的窗口调用窗口程序,并立即返回
SendNotifyMessage()        // 将指定的消息发送到一个窗口
SendMessageTimeout()    // 将指定的消息发送到一个或多个窗口
PostMessage()        // 将一条消息放入到消息队列中
PostThreadMessage()        // 将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回
PostQuitMessage()        // 向系统表明有个线程有终止请求
BroadcastSystemMessage()    // 该函数发送消息给指定的接受者
GetMessage()        // 从调用线程的消息队列里取得一个消息并将其放于指定的结构
PeekMessage()        // 为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构
WaitMessage()        // 当一个线程的消息队列中无其它消息时,该函数就将控制权交给另外的线程,同时将该线程挂起,直到一个新的消息被放入线程的消息队列之中才返回
DispatchMessage()        // 该函数分发一个消息给窗口程序

溯源

了解攻击链

恶意攻击活动大概有以下七步:

侦查 -> 定向的攻击工具制作 -> 将攻击工具输送到目标主机上 -> 攻击代码在目标主机上触发 -> 远控程序的安装 -> 攻击工具与远控程序(C2)交互 -> 窃取信息(横向扩大战果)

追踪溯源的方法

主要要理清楚:发动攻击的人是谁,有啥背景,攻击的意图是什么,此次攻击使用了什么技术、使用了那些工具,整个攻击的路径是咋样的

恶意样本追踪溯源可采取以下五种方式

  • 域名/IP分析
  • 入侵日志分析
  • 全流量分析
  • 同源分析
  • 攻击模型分析

域名/IP分析

最常用的方法,通过挖掘攻击者的域名/IP来定位攻击者

可以使用微步等网站,分析恶意域名/IP,通过whois查询等一系列社工的方法找到攻击者的社交账号等信息

入侵日志分析

通过分析相关主机日志、web日志来提取相关攻击者的信息

linux下

~/.bash_history #历史命令记录文件的路径
命令: cat ~/.bash_history   查看历史命令
        history -a      将当前shell会话的历史命令追加到命令历史文件中,命令历史文件是保存历史命令的配置文件。
       history -c     清空当前历史命令列表。
        history -d     删除历史命令列表中指定序号的命令。
        history -n    从命令历史文件中读取本次Shell会话开始时没有读取的历史命令。
        history -s    将指定的命令作为单独的条目加入命令历史内存缓冲区。在执行添加之前先删除命令历史内存缓冲区中最后一条命令。
        history -w    把当前的shell历史命令内存缓冲区的内容写入命令历史文件。

/var/log查看日志
/var/log/boot.log:录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息
/var/log/lastlog :记录最后一次用户成功登陆的时间、登陆IP等信息
/var/log/messages :记录Linux操作系统常见的系统和服务错误信息
/var/log/secure :Linux系统安全日志,记录用户和工作组变坏情况、用户登陆认证情况
/var/log/btmp :记录Linux登陆失败的用户、时间以及远程IP地址
/var/log/syslog:只记录警告信息,常常是系统出问题的信息,使用lastlog查看
/var/log/wtmp:该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,使用last命令查看 /var/run/utmp:该日志文件记录有关当前登录的每个用户的信息。如 who、w、users、finger等就需要访问这个文件 /var/log/syslog 或 /var/log/messages 存储所有的全局系统活动数据,包括开机信息。基于 Debian 的系统如 Ubuntu 在
/var/log/syslog 中存储它们,而基于 RedHat 的系统如 RHEL 或 CentOS 则在t
/var/log/messages 中存储它们。
/var/log/auth.log 或 /var/log/secure 存储来自可插拔认证模块(PAM)的日志,包括成功的登录,失败的登录尝试和认证方式。Ubuntu 和 Debian 在
/var/log/auth.log 中存储认证信息,而 RedHat 和 CentOS 则在 /var/log/secure 中存储该信息。

windows下

日志路径:C:\Windows\System32\winevt\Logs
应用程序日志,系统日志,安全日志
审核策略与事件查看器(审核策略默认不开启,若日志系统出现故障、安全事故则可以查看系统的日志文件,排除故障,追查入侵者的信息等)
路径:开始——管理工具——本地安全策略——本地策略——审核策略
设置合理的日志属性,日志最大覆盖阈值
分析日志:事件ID
4624   登录成功
4625   登录失败
4634   注销成功
4647   用户启动的注销
4672   使用超级用户进行登录
4720   创建用户
            登录类型
2  交互式登录
3  网络
4  批处理
5  服务
7   解锁
8   网络明文

全流量分析

通过全流量分析,还原整个入侵过程,结合入侵日志进一步对恶意样本攻击进行追踪溯源

同源分析

获取到恶意样本后,可以通过和历史恶意代码相似度比较,获取历史攻击时间,关联到响应的组织

攻击模型分析

分析攻击的模型,查找相应会使用该攻击模型的组织

溯源常用步骤

攻击源捕获

  • 安全设备报警,如IP扫描、口令爆破、病毒木马等
  • 日志与流量分析,异常的流量,攻击流量
  • 服务器资源异常,异常的文件、账号、进程、端口、服务等
  • 邮件钓鱼,恶意样本,恶意的URL
  • 蜜罐系统捕获,获取攻击者行为,意图

溯源反制

  • IP定位技术:根据IP定位物理位置
  • ID追踪技术:通过搜索引擎、社交账号、社工库匹配ID
  • 网站URL:通过whois查询,查询URL注册人的相应信息
  • 恶意样本:分析恶意样本、提取相关信息,比如用户名、IP、域名、C2信息
  • 社交账号:通过JSONP跨域,获取攻击者的主机信息、浏览器信息等

攻击者画像

  • 分析攻击路劲,分析攻击目的,是否拿到权限,是否窃取信息,分析网络代理,是否使用国外或匿名代理,分析攻击手法,是否使用鱼叉攻击或web渗透
  • 攻击者画像,分析出攻击者的虚拟身份,ID/网名等,查询真实信息,姓名/物理地址等,查询联系方式等信息

参考:

恶意样本分析手册

http://blog.nsfocus.net/malware-sample-analysis-summary/

sql注入

产生原因

在程序代码中,对用户提交的参数未做过滤直接拼接到sql语句中,破坏了原有sql语句的逻辑,执行了任意sql语句

利用手法

联合查询注入、堆叠查询注入、盲注(时间盲注、布尔盲注、报错性注入、宽字节注入、二次注入、万能密码

修复建议

过滤特殊字符,对相应字符进行过滤

参数化查询

预编译

限制数据库的权限

隐藏sql报错信息

统一编码

代码执行

产生原因

应用程序对传入数据过滤不严,导致代码被注入到应用程序中,最终被执行

常见代码执行函数

PHP

eval();        // 把字符串当做PHP代码执行
assert();        // 判断是否为字符串    ,是则当成代码执行
call_user_func();    // 第一个参数是被调用的回调函数,其余是回调函数的参数
call_user_func_array()        //第一个参数是被调用的回调函数,参数数组是回调函数的参数
preg_replace()        // 当时用/e修饰时替换的东西是代码的时候会执行
create_function()    // 创建匿名函数

JAVA

Java 没有类似于前者的函数,但存在反射机制,有基于反射机制的表达式引擎,OGNL/SPEL/MVEL

命令执行

常见命令执行函数

PHP

system(args)    // 有回显
passthru(args)    // 有回显
exec(args)        // 必须用echo输出
shell_exec(args)    // 无回显
反引号  ``
popen(handle, mode)        // 无回显
proc_open()        // 无回显
$process = proc_open()        
echo stream_get_contents($pipes[1]);

JAVA

Runtime执行命令
ProcessBuilder执行命令
利用手法

使用管道符拼接命令,使用dnslog或者ceye外带回显

修复建议

不执行外部的应用程序和命令

利用escapeshellarg函数处理相关参数

使用safe_mode_exec_dir执行可执行的文件路径

模板注入

程序接受恶意的用户数据后,未做验证直接作为模板的一部分,导致信息泄露、代码执行

常见模板:

php:twig,smarty,blade

python:jinja2,tornado,Django

java:velocity、freemarker

修复建议

对用户传入的数据做严格的限制

XXE

用户将恶意代码注入到xml文档中,可读取敏感文件,可扫描内网端口

修复建议

禁用外部实体

过滤用户提交的xml数据

升级libxml组件

cookie登录绕过漏洞

当cookie是外部可控或者验证不严就会被绕过

修复建议

对外部输入进行过滤

使用更为安全的session验证

session身份绕过漏洞

如果用户可以获取到session,就可以绕过登录限制,比如一些session存放在web目录下或者是数据库内,就有可能会被用户获取

修复建议

不要将session存放在web文件夹中

伪随机码漏洞

伪随机码可以被实现预测

修复建议

使用较为安全的随机码

对次数做限制,防止被爆破

文件上传漏洞

产生原因

程序员对用户上传的文件没有做严格的限制,导致用户可以越过本身的权限,上传脚本文件

绕过方法

后缀大小写、双写,不常见的后缀

上传.htaccess文件

分块传输

空格或者00截断

利用系统特性绕过

修复建议

对于网站中的上传模块做好权限认证

在文件上传目录设置为禁止脚本文件执行

设置白名单验证

在文件上传后,修改文件名为随机

文件解析漏洞

中间件在解析文件的时候出了问题,导致将一些文件解析称为脚本文件,可配合文件上传漏洞

比如IIS5.X/6:

  • 在网站下建立文件夹的名字为.asp、.asa的文件夹,其目录内的任何扩展名的文件都被 IIs当作asp文件来解析并执行
  • 分号后面的不被解析,也就是说, cracer.asp;.jpg

apache解析漏洞:apache是从左到右开始判断解析,如果为不可识别解析,就再往左判断

修复建议

升级中间件版本,即使打好补丁

文件下载漏洞

程序对可下载的文件没有做好限制,导致用户可以下载任意敏感文件

修复建议

过滤./使得用户在URL中不能回溯目录

严格判断用户输入的参数的格式

php.ini 配置 open_basedir 限定文件的访问范围

文件包含漏洞

产生原因

程序在引用文件时,当用户对引用的文件名可控,并且未做合理的过滤,到时用户可以包含任意文件,并且可以利用伪协议达到类似代码执行的效果

文件包含函数
include()
require()
include_once()
require_once()
常见利用方法

本地文件包含、远程文件包含、包含日志getshell、包含环境变量getshell、利用伪协议

修复建议

严格判断被包含的文件是否用户可控

做好文件包含验证

限制路径

设置好 allow_url_include 为off

未授权访问

程序未做好访问控制,导致用户可以访问到一些敏感页面

Active MQ 未授权访问
Atlassian Crowd 未授权访问
CouchDB 未授权访问
Docker 未授权访问
Dubbo 未授权访问
Druid 未授权访问
Elasticsearch 未授权访问
FTP 未授权访问
HadoopYARN 未授权访问
JBoss 未授权访问
Jenkins 未授权访问
Jupyter Notebook 未授权访问
Kibana 未授权访问
Kubernetes Api Server 未授权
LDAP 未授权访问
MongoDB 未授权访问
Memcached 未授权访问
NFS 未授权访问
Rsync 未授权访问
Redis 未授权访问
RabbitMQ 未授权访问
Solr 未授权访问
SpringBoot Actuator 未授权访问
Spark 未授权访问
VNC 未授权访问
Weblogic 未授权访问
ZooKeeper 未授权访问
Zabbix 未授权访问
修复建议

做好访问控制权限

信息泄露

程序未对权限做好控制,或者将敏感文件放在用户可以看到的地方,可能导致敏感信息泄露甚至网站源码的泄露

修复建议

做好敏感文件的存放,做好访问控制权限

目录遍历

后台对用户传来的值没有做好验证,导致用户可以传来./等数据,然后把上机目录遍历出来

修复建议

严格限制用户传入的数据

配置web访问权限

对用户传进来的文件统一编码

XSS

允许插入恶意代码到页面中,提供给其他用户访问产生跨站脚本攻击,分为反射性、存储型、dom型

漏洞危害

盗取账户信息

还行恶意命令

网站挂马

钓鱼

修复建议

对输入进行过滤,对输出进行编码

使用html实体化

CSRF

挟持用户在当前已登录的页面上执行非本意的操作

利用方法

用户打开浏览器访问受信任的网站A,在浏览器内保存了一个cookie,然后用户打开了一个可以的网站B,网站B中存在恶意代码,要求用户去访问网站A并执行恶意操作,因为当前浏览器是存在网站A的cookie的,所以说会执行成功

修复建议

增加token验证

有安全的会话管理

有安全的访问控制管理

增加验证码

SSRF

利用方法

支持多种协议,可以使用file协议读取文件,可以探测内网主机存活率以及开放端口状态

修复建议

禁止跳转

过滤返回的信息

禁止一些用不到的协议

限制请求的端口

设置URL白名单

JSONP

jsonp是json的一种使用方式,可以跨域读取资料,可以让网页从别的域名那里获取资料

利用原理

用户访问一个网站A,该网站存在JSONP接口,当用户访问该JSONP接口的时候,会返回用户信息,如果该接口对来源验证有错误,则用户访问网站B的时候,网站B可以利用JSONP漏洞来获取用户信息

利用方法

用户访问网站A时,身份认证还未失效,攻击者恶意构造好代码,就会获取JSON数据,然后把数据发送给攻击者

修复建议

json正确的http头输出尽量避免跨域的数据传输,对于同域的数据传输使用xmlhttp的方式

对跨域的数据传输必须做好验证

CORS跨域资源共享漏洞

查看页面,若 Access-Control-Allow-Origin 设置为*,则所有域名都可以请求本站资源

修复建议

不要把 Access-Control-Allow-Origin 设置为*,严格校验来自请求数据汇总的Origin的值

避免使用 Access-Control-Allow-Credentials: true

减少 Access-Control- Allow-Methods 所允许的方法

逻辑漏洞

越权、密码找回、任意金额修改

修复建议

做好身份验证,对加密算法一定要是强加密,验证用户身份一定要在后端实现

URL重定向

程序在跳转的时候,对客户端传来的重定向地址没有做好校验,导致浏览器跳转到恶意页面,会被拿来钓鱼

修复建议

限制referer

加入token机制

条件竞争漏洞

对于并发的编程,像php、java、操作系统中,运行的结果依赖于不可控的先后顺序,导致一个线程打开后,被别的线程修改了

像PHP里面可以使用条件竞争绕过文件上传防护,在java中多线程操作的时候,导致恶意结果,在操作系统中导致权限提升

修复建议

设置锁

对于数据做好充分验证