Tuesday, 20 November 2012

Debian之OpenVPN配置

1. OpenVPN安装
  Debian安装OpenVPN server: apt-get install openvpn
  配置脚本默认安装在/usr/share/doc/openvpn/examples/easy-rsa/2.0下
  配置文件默认放在/etc/openvpn

  MaxOSX安装OpenVPN客户端: tunnelblick

2. Server配置
  ./build-ca
  ./build-key-server server
  ./build-key client
  ./build-dh

  Server需要ca.crt, server.key, server.crt, dh1024.pem

  Server配置文件默认在/usr/share/doc/openvpn/examples/sample-config-files/server.conf
  
port 1194
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 202.107.105.13"
push "dhcp-option DNS 202.108.107.21"
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
启动OpenVPN server: /etc/init.d/openvpn start

配置IP转发: echo 1 > /proc/sys/net/ipv4/ip_forward
修改/etc/sysctl.conf: 取消注释net.ipv4.ip_forward = 1

配置iptables规则:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -L查看规则配置是否成功

3. Client配置

client
dev tun
proto udp
remote 66.32.272.181 1194
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
mute-replay-warnings
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client_kevin.crt
key /etc/openvpn/client_kevin.key
ns-cert-type server
comp-lzo
verb 3
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

Thursday, 28 June 2012

Virtual Attributes In Ruby

class Song 
  def initialize(name, artist, duration)
    @name = name 
    @artist = artist 
    @duration = duration 
  end 


  def to_s 
    "song: #{@name} -- #{@artist} (#{@duration})" 
  end 


  def durationInMinutes 
    @duration / 60.0 
  end 


  def durationInMinutes=(value)
    @duration = (value * 60).to_i 
  end 
end 


song = Song.new "aaa", "bbb", 240 
p song.instance_variables >> [:@name, :@artist, :@duration] 
p song.to_s               >> "song: aaa -- bbb (240)" 
song.durationInMinutes = 10 
p song.instance_variables >> [:@name, :@artist, :@duration] 
p song.to_s               >> "song: aaa -- bbb (600)"

Ruby之$_小记

  $_记录最后一行从gets或者readline的字符串。如果print不带参数则输出$_;如果if/while判断为一个正则表达式,则为正则表达式是否匹配$_。
gets        >> "aaa"
puts $_     >> "aaa"
print       >> "aaa"
if /a+/
  puts "bbb"
end         >> "bbb"
  ARGF是一个流,用作在脚本中处理文件,从命令行参数或者STDIN输入,ARGF会对ARGV的每一个参数当作文件流依次载入,并将其从ARGV中移除;如果ARGV为空,则从STDIN输入。
ARGF.each { |line| puts line if line =~ /Ruby/ }

Wednesday, 27 June 2012

MiniMagick/RTesseract安装小记

  1. gem install mini_magick
  2. apt-get install libmagick9-dev
  3. gem install rtesseract

Tuesday, 5 June 2012

[译]Password Cracking with GPUs

  原文见:      比较流行的几种HASH算法:   
  • MD5
  • SHA1/SHA256/SHA512
  • phpass:PHP-based site like WordPress
  Linux下将密码的HASH保存在/etc/shadow中,格式为
$id$salt$encrypted
其中id位代表HASH算法:
  • 1 = MD5
  • 5 = SHA-256
  • 6 = SHA-512
  使用GPU比使用CPU破解密码或者用作Bitcoin挖矿要快得多。简单的来说,GPU中有很多专用芯片做32位操作速度非常快,即使CPU可以做很多通用计算,GPU中的芯片做某些特殊类型的运算会更快,并且以一种更加并行的方式,详细的原因可以参考此文:Why a GPU mines faster than a CPU
  Why a GPU mines faster than a CPU中一文是如此解释的:GPU主要是辅助渲染3D图像和视觉效果。通常的计算机会配置更慢但是功耗更小和更便宜的IGPs(Integrated Graphics Processor集成图像处理器),其集成在主板上,而AGP/PCIe显卡能提供更强的图像处理。简单来说一个CPU核心每个时钟周期可以执行4条32位指令如果使用128位SSE指令集,如果使用256位AVX可以执行8条;然而对于GPU(Radeon HD 5970)每个时钟周期可以执行3200条32位指令使用其3200个ALUs和shaders(着色器)。
  CPU被设计为主要执行和决策,每个CPU中也有多个ALU,并且CPU中有大量的结构用来确保迅速的状态切换。另外:
  • 执行特权级别,用户态和操作系统的界限
  • 为程序创建虚拟内存
  • 向前兼容遗留代码
  GPU被设计为做图像处理,图像处理是很多重复性的工作,所以GPU中有大量的ALU,比CPU具有更强的数学计算能力。GPU更适合处理重复的运算而不是处理条件逻辑
  GPU上的ALU分成组,每个组公共管理,所以每个组内的ALU不能单独处理任务,对于Bitcoin挖矿来说就是重复尝试不同的HASH。对ATI Radeon 5970显卡来说,其有3200个流处理器,并且5970使用了VLIW-5体系结构,实际3200个流处理器只需要640个核心,每个核心每个时钟周期执行5条指令。Nvidia类似的称作"Cuda Cores",但是Nvidia没有采用VLIW结构,每个核心无法处理多条指令,所以单从核心数比较性能是不准确的,在计算SHA-256下,Nvidia比ATI差。对于ATI显卡通常有大量简单的ALU/shader(VLIW设计),并且通常运行在一个较低的时钟频率(1120-3200 ALUs at 625-900 MHz)。Nvidia采用微架构(microarchitecture),其包含少数更复杂的ALU和更高的时钟频率来补偿(448-1024 ALUs at 1150-1544 MHz):
  • AMD Radeon HD 6990: 3072 ALUs x 830 MHz = 2550 billion 32-bit instruction per second
  • Nvidia GTX 590: 1024 ALUs x 1214 MHz = 1243 billion 32-bit instruction per second
  所以对于基于ALU运算的操作,效果差异非常明显,如Bitcoin和暴力破解密码。对于Bitcoin来说基于SHA-256算法,有大量的32位循环右移操作,在AMD的GPU(BIT_ALIGN_INT)上只需要一个指令,在NvidiaGPU上需要三条指令(2 shifts + 1 add),在Bitcoin挖矿中,AMD GPU可以达到3x-5x更快的速度。详细可以参考当下各种CPU/GPU速度比较Mining hardware comparison
  利用GPU做密码破解除了安装显卡的相关驱动外,还需要AMD APP SDK for OpenCL库或者Nvidia CUDA库。破解工具选择Hashcat,Hashcat包含以下工具:
  • hashcat:基于CPU,支持最多的HASH算法
  • oclHashcat:基于GPU,支持部分HASH算法,内置字典攻击,穷举攻击,掩码攻击
  • oclHashcat-plus:优化的多HASH字典攻击,支持管道输入
  • oclHashcat-lite:优化攻击单个HASH,最快但支持算法最少
  • maskprocessor:生成字典,并管道输出给oclHashcat-plus
  如果是Nvidia GPU使用cuda开头的,否则使用ocl。
type example.dict | cudaHashcat-plus64.exe -m 400 example400.hash
  • 字典攻击:
  • cudaHashcat-plus64.exe -m 400 example400.hash example.dict
  • 计算破解速度:

  •   通过Speed看出每秒9973次比较,查看此网站可以估算破解时间Password Recovery Speeds。如果密码采用[a-zA-Z0-9]一共62个字符,如果是6位密码,有超过568亿种组合,除以每秒比较次数可以得到估计时间。
  • 穷举攻击
  •   maskprocessor用以下符号代表字符集:
    • ?d = all decimals (0–9)
    • ?l = lowercase characters (a–z)
    • ?u = uppercase characters (A–Z)
    • ?s = symbols
      并且可以自定义字符集-1(-2或者-3),然后使用?1(?2或者?3)来使用定义的字符集,例如生成一个6位密码:
    mp64.exe -1 ?d?l?u ?1?1?1?1?1?1
  

Saturday, 26 May 2012

[译]查找Ntoskrnl.exe基址

  原文见Finding Ntoskrnl.exe Base Address

  大多数用户态Payload会首先定位kernel32.dll的基址,而在内核态下为ntoskrnl.exe(又简称nt)。nt是windows内核的核心,并为驱动程序提供核心接口,对于内核Payload来说,定位ntoskrnl.exe的基址有利于定位其导出函数。
  其中一种方法是在nt的内存映射区域内向低地址扫描直到找到“MZ”标志,又称“scandown",在实现中为了优化,采用PAGE_SIZE大小递减,不过会增加4个字节存储空间,如果对Payload的大小有限制,也可以采用一个一个字节查找。如果开启/3G启动标志,则这种方法可能失效。
  • IDT Scandown
  •   从IDT handler的high-order word开始查找,然后一个字节一个字节查找:
    00000000 8B3538F0DFFF mov esi,[0xffdff038]
    00000006 AD           lodsd
    00000007 AD           lodsd
    00000008 48           dec eax
    00000009 81384D5A9000 cmp dword [eax],0x905a4d
    0000000F 75F7         jnz 0x8

      如果nt基址恰好没有和4字节吻合,那么上面的搜索方式可能会出错,如果DF位没有清空,也可能出错,并且字节序中包含NULL字节。采用PAGE_SIZE搜索的方式可以消除这些问题:
    00000000 6A38         push byte +0x38
    00000002 5B           pop ebx
    00000003 648B03       mov eax,[fs:ebx]
    00000006 8B4004       mov eax,[eax+0x4]
    00000009 662501F0     and ax,0xf001
    0000000D 48           dec eax
    0000000E 6681384D5A   cmp word [eax],0x5a4d
    00000013 75F4         jnz 0x9

  • KPRCB IdleThread Scandown
  •    另一种方法是从当前的KPCR的KPCRB中IdleThread属性,这个属性总是指向nt中的一个全局变量。
    00000000 A12CF1DFFF   mov eax,[0xffdff12c]
    00000005 662501F0     and ax,0xf001
    00000009 48           dec eax
    0000000A 6681384D5A   cmp word [eax],0x5a4d
    0000000F 75F4         jnz 0x5

  • SYSENTER_EIP_MSR Scandown
  •    适用环境:XP, 2003 (modern processors only)
       如果处理器支持系统调用MSR 0x176 (SYSENTER_EIP_MSR),从返回的系统调用句柄开始查找:
    00000000 6A76         push byte +0x76
    00000002 59           pop ecx
    00000003 FEC5         inc ch
    00000005 0F32         rdmsr
    00000007 662501F0     and ax,0xf001
    0000000B 48           dec eax
    0000000C 6681384D5A   cmp word [eax],0x5a4d
    00000011 75F4         jnz 0x7

  • Known Portable Base Scandown
  •   适用环境:2000, XP, 2003 SP0
      nt的内存映射基址有个地址范围,其和系统版本有关,0x8050babe对前三种都适用:
    00000000 B8BEBA5080   mov eax,0x8050babe
    00000005 662501F0     and ax,0xf001
    00000009 48           dec eax
    0000000A 6681384D5A   cmp word [eax],0x5a4d
    0000000F 75F4         jnz 0x5

    PlatformBase AddressEnd Address
    Windows 2000 SP40x804000000x805a3a00
    Windows XP SP00x804d00000x806b3f00
    Windows XP SP20x804d70000x806eb780
    Windows 2003 SP10x808000000x80a6b000
  另外,内核态下FS指向_KPCR结构

Monday, 14 May 2012

ubuntu下gem搜索路径

ububtu下gem路径有些怪异,用gem install的方式装的三方库在/var/lib/gems下,可以用gem env查看。
然而在irb下的Gem.path却是不同,在/use/lib/ruby/gems,所以往往造成安装了相应的包,require却仍然提示no such file。
简单的解决方法是在/etc/bash.bashrc加上"GEM_PATH="/var/lib/gems/1.9.2" export GEM_PATH"

Sunday, 29 April 2012

备忘

前几天看教程,然后在自己win 7 64bit调试32位编译的shellcode,其调用是syswow64下的动态库,而且由于默认开了aslr,所以传统api定位地址的方式实效的。而且sleep方法居然调用的是kernelbase导出的,不是kernel32.