网站首页 包含标签 网络安全技术 的所有文章

  • 攻防演练 | 如何使用 Docker 搭建代理池+隧道代理

    前言 作为一种常见的服务器防御网络攻击或探测手段,封 IP 可以有效地保护服务器免受恶意攻击。在进行安全测试时,安全人员需要使用代理来隐藏真实 IP 地址,并依靠代理池获取可用的代理地址。同时,为了更方便地在某些工具中使用代理,可以借助隧道代理直接将请求转发给不同的代理服务器,从而避免 IP 被封锁。 本文介绍了一种利用 Docker 搭建代理池和隧道代理的方法,并通过对 httpbin.org 的访问和红队工具 dirsearch 的使用进行了测试。这种方法能够快速搭建一个免费、高效、稳定且易于管理的代理环境,在进行网络渗透测试等任务时非常有帮助。 下图为搭建过程的流程图: Docker 的准备 我这里都是使用的 Docker 搭建。 Docker 可能用到的命令如下: # 查看当前运行的 docker 容器 ID 和运行状况 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c09ae6b9c554 tunnel_proxy:0.02 "/usr/local/openrest…" 2 hours ago Up 2 hours tunnel_proxy 17bc67d0f892 germey/proxypool:master "supervisord -c supe…" 2 hours ago Up 2 hours 0.0.0.0:5555->5555/tcp, :::5555->5555/tcp proxypool b659295a7927 redis:alpine "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:6374->6379/tcp, :::6374->6379/tcp redis4proxypool [root@localhost ~]# docker exec -it 17 /bin/sh/app # lsDockerfile README.md docker-compose.yml kubernetes release.sh run.py supervisord.logLICENSE build.yaml examples proxypool requirements.txt supervisord.conf exit 退出   命令:docker exec -it <id> /bin/bash在指定 id 的 Docker 容器中执行指令,id 通过docker ps命令来获取。如果执行的是 shell 程序比如 /bin/bash 或者 /bin/sh 就能进入到容器的 shell 里,可以执行一些 linux 指令,id 可以使用前几位可以区分不同容器的字符就行,我这里用的前两位。 如果在接下来的配置中有问题,可以使用这种方式进入容器里查看日志,或者按照我的配置将日志文件映射到本地。 启动 Docker 用的程序是 docker-compose。如果你输入 docker-compose 提示找不到这个程序,有可能是没有安装或者是 /bin 目录下没有。 使用docker info命令查看 docker-compose 程序的位置 [root@localhost ~]# docker infoClient: Docker Engine - Community Version: 24.0.2 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.10.5 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.18.1 Path: /usr/libexec/docker/cli-plugins/docker-compose 检查一下 docker-compose 有无执行权限,如果没有,就要sudo chmod +x /usr/local/bin/docker-compose赋予执行权限 [root@localhost proxy_pool]# cd /usr/libexec/docker/cli-plugins/[root@localhost cli-plugins]# ll总用量 108356-rwxr-xr-x 1 root root 56327368 5月 26 05:56 docker-buildx-rwxr-xr-x 1 root root 54627904 5月 20 02:09 docker-compose 如果无法直接运行 docker-compose,可能需要创建软链接 [root@localhost cli-plugins]# ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/bin/docker-compose[root@localhost work]# docker-compose --versionDocker Compose version v2.18.1 代理池 ProxyPool 我这里用的是开源的代理池,自动从免费代理网站上爬取 http 代理。Python3WebSpider/ProxyPool 这个项目有四个模块:获取IP模块,存储模块,检测模块,接口模块。它包含两个 Docker 容器:redis4proxypool 和 proxypool,对于容器的设置都在 ProxyPool 根目录的 docker-compose.yml 文件里。对于容器的配置留到下部分再详细描述,先跑起来再说。 首先 gitclone git clone https://github.com/Python3WebSpider/ProxyPool.gitcd ProxyPool 然后启动 docker 环境 docker-compose up 这时候如果防火前的 5555 端口是开放的,访问 http://<当前 ip>:5555/random 即可随机获取一个可用代理,不需要做任何的修改。效果图如下: random 接口返回的是随机的高分 IP,也就是已验证能访问测试 URL 的 IP。高分,指的是在 redis 数据库中,获取 IP 模块获取的每一条 IP 的分数,如果检测模块用 IP 访问测试链接,能成功访问则设置这个分数为 100,单次测试访问失败则将分数减 1。 ProxyPool 的配置 在 ProxyPool 目录下使用命令docker-compose down可以关闭 docker。接下来,我们修改 ProxyPool 的配置。它包含两个容器,一个是 redis4proxypool,也就是 redis 数据库的部分,下文用 redis 来代替,另一个容器是 proxypool,也就是负责代理池逻辑的部分。 redis 为了查看或者 redis 里的这些数据,首先要设置 docker-compose.yml,设置 6374 的端口映射 version: "3"services: redis4proxypool: image: redis:alpine container_name: redis4proxypool # 把容器内部的 6379 端口映射到宿主机(host)的 6374 端口,这样就可以通过宿主机的 6374 端口来访问容器内部的 Redis 数据库 ports: - "6374:6379" proxypool: image: "germey/proxypool:master" container_name: proxypool ports: - "5555:5555" restart: always # volumes: # - proxypool/crawlers/private:/app/proxypool/crawlers/private environment: PROXYPOOL_REDIS_HOST: redis4proxypool 开启容器之后,要查看 redis 用到的命令如下: [root@localhost ProxyPool]# redis-cli -h 127.0.0.1 -p 6374   keys * 获取 redis 中所有的 key 127.0.0.1:6374> keys * "proxies:universal" type <key> 获取 key 的类型 127.0.0.1:6374> type proxies:universalzset 因为是 zset 有序类型,所以用 zrange 获取所有数据,后面两个参数是开始位置和结束位置 127.0.0.1:6374> zrange proxies:universal 0 -1...18156) "72.44.101.173:8080"18157) "95.56.254.139:3128" 获取分数为 100 的,用 zrangebyscore,后面两个参数是最小值和最大值 127.0.0.1:6374> zrangebyscore proxies:universal 99 100 "103.189.96.98:8085" "186.121.235.66:8080" "200.4.217.203:999" "103.74.121.88:3128" "117.251.103.186:8080"... exit 退出 proxypool 针对 proxypool 也有不少设置可以自定义,在使用 Docker 的情况下,在 docker-compose.yml 文件中,设置 environment 参数即可。 这里修改了 volumes 参数,把容器里的指定文件夹映射到宿主机的指定位置。proxypool 在容器里工作的根目录是 /app,所以这里是把 /app/proxypool/logs 文件夹映射到主机的 ProxyPool/logs/proxypool 目录下。 设置了以下环境变量: CYCLE_TESTER, Tester 运行周期,即间隔多久运行一次测试,默认 20 秒,这里修改为 5 秒。 PROXYPOOL_REDIS_PORT,容器内部的 6379 连接 redis4proxypool。 TEST_URL, 测试 URL,默认百度,指定要爬取的 URL。 REDIS_KEY,redis 储存代理使用字典的名称,其中 PROXYPOOL_REDIS_KEY 会覆盖 REDIS_KEY 的值。 LOG_DIR: "proxypool/logs" ,这个参数不知道为啥设置了并没有什么用,尝试了 n 遍,本来按照源码,没有上面这个参数也应该写到 logs 相对目录下,但是程序并没有写入,所以保存日志文件只能用下面这种相对路径的写法。 LOG_RUNTIME_FILE,运行日志文件名称。 LOG_ERROR_FILE,错误日志文件名称。 加了 depends_on 参数,意思是先启动 redis4proxypool 在启动 proxypool,这样确保在启动 proxypool 之前先启动了 redis4proxypool,以避免可能的连接问题。 version: "3"services:redis4proxypool:image: redis:alpinecontainer_name: redis4proxypoolports: "6374:6379"proxypool:image: "germey/proxypool:master"container_name: proxypoolports: "5555:5555"restart: always volumes: ./logs/proxypool:/app/proxypool/logsvolumes: - proxypool/crawlers/private:/app/proxypool/crawlers/private environment:CYCLE_TESTER: 5PROXYPOOL_REDIS_HOST: redis4proxypoolPROXYPOOL_REDIS_PORT: 6379TEST_URL: https://httpbin.org/ipREDIS_KEY: proxies:httpbinLOG_RUNTIME_FILE: "./proxypool/logs/proxypool_runtime.log"LOG_ERROR_FILE: "./proxypool/logs/proxypool_error.log"depends_on: redis4proxypool 隧道代理 我们使用一些扫描或者爆破工具的时候,大部分情况下,配置选项中只能选择一条代理,被封 IP 的可能性仍然很大,有没有什么方法能在请求的时候自动切换代理服务器呢?这就是隧道代理。 隧道代理服务器,能将接收到的请求随机或者按规则转发给不同的代理,这样,相当于在工具中只需要设置代理为隧道代理服务器,自动切换 IP 的任务交给隧道代理。 我这里使用的 OpenResty 搭建的隧道代理,也是用的 Docker,并把配置整合到了 docker-compose.yml 文件中。 参考链接:openresty实现隧道代理 ...

    2023-10-21 331
  • 漏洞分析 | WordPress 插件权限提升漏洞(CVE-2023-32243)

    漏洞概述 Essential Addonsfor Elementor是一款功能强大、易于使用的WordPress插件,为使用Elementor建立网站的用户提供了众多额外的功能和组件,使得用户能够更轻松地创建各种网站元素,并且还提供了许多预设计样式和高级功能,使得用户能够更好地管理和定制网站。此外,通过WordPress官方统计(https://api.wordpress.org/plugins/info/1.0/essential-addons-for-elementor-lite.json)可知,它的安装量超过百万。 近期,其密码重置功能存在授权问题,允许未经认证的远程攻击者实现权限提升。 受影响版本 受影响版本:5.4.0 <= Essential Addons for Elementor <= 5.7.1 漏洞分析 问题关键在于Essential Addons for Elementor的密码重置功能没有验证密码重置密钥,就直接改变了指定用户的密码,也就是说攻击者只需知道用户名,就有可能进行密码重置,并获得对应账户的权限。 这里我们采用打补丁前的最新版本(5.7.1)进行分析,具体链接如下:https://downloads.wordpress.org/plugin/essential-addons-for-elementor-lite.5.7.1.zip 先从includes/Classes/Bootstrap.php看起,这段代码是在WordPress中添加一个动作,当网站初始化时触发该动作,调用login_or_register_user() 该函数位于includes/Traits/Login_Registration.php 它的作用是处理登录和注册表单的提交数据,并根据提交的数据调用相应的方法。正如漏洞概述所说,问题关键在于密码重置,所以我们继续跟进reset_password(),它做的第一步操作就是检查page_id和widget_id是否为空,若为空则返回”xxx ID is missing”,用作后续的错误处理,所以我们首先要做的就是给这两个id赋值: 接着代码就会检查eael-resetpassword-nonce的值是否为空,若不为空则通过wp_verify_nonce()进行验证。 那么问题来了,nonce是什么?如何获取? 在 WordPress 中,nonce 是一个随机字符串,用于防止恶意攻击和跨站请求伪造(CSRF)攻击,它通常与表单一起使用,在表单提交时添加一个随机值,以确保表单只能被特定的用户或请求使用。而关于nonce如何获取,wp_create_nonce()可以做到这一点。 function wp_create_nonce( $action = -1 ) { $user = wp_get_current_user(); $uid = (int) $user->ID; if ( ! $uid ) { /** This filter is documented in wp-includes/pluggable.php */ $uid = apply_filters( 'nonce_user_logged_out', $uid, $action ); } $token = wp_get_session_token( $action ); $i = wp_nonce_tick( $action ); return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); } 但需要注意的是,攻击者无法通过本地生成的 nonce 绕过受害者站点的wp_verify_nonce() 验证,因为他们不能在本地生成与受害者站点相同的 nonce。不过还有一种方法来获取nonce,直接访问主页即可在localize里找到它。 至于原因,则是它被includes/Classes/Asset_Builder.php::load_commnon_asset()设置在localize_object内: 跟踪localize_object不难发现,它被两个函数调用过: 先看add_inline_js(),它用于加载内联js代码和变量。在前端页面加载时,浏览器将加载该代码,并在js中创建名为 localize 的变量,该变量的值就是localize_objects 数组经wp_json_encode()转换的json字符串。 显然,我们刚才直接访问主页发现的localize就是以json格式呈现的。再看frontend_asset_load(),它用于加载前端资源。 最终上述两个函数都会被init_hook()调用,add_inline_js() 被添加到 wp_footer 中,优先级为100,以便在 WordPress 前端页面的页脚中加载内联js代码和变量。而frontend_asset_load() 被添加到 wp_enqueue_scripts 中,优先级为100,以便在 WordPress 前端页面加载时加载所需的前端资源。 之后就是给eael-pass1、eael-pass2赋值,设置新密码了: 当我们满足了上述前提条件以后,再通过rp_login设置想要攻击的用户即可。此时,代码就会借助get_user_by() function get_user_by( $field, $value ) { $userdata = WP_User::get_data_by( $field, $value ); if ( ! $userdata ) { return false; } $user = new WP_User(); $user->init( $userdata ); return $user; } 按我们给定的字段,也就是用户名去检索用户信息: 如果这是真实存在的用户,就调用reset_password() 进行密码重置操作: 漏洞复现 通过以上分析,我们仅需知道用户名以及nonce值,再向受害站点发送满足漏洞触发条件的请求体,即可进行漏洞利用。 当然,之前也提到了受影响的版本,所以漏洞利用之前,需要优先进行版本探测,有两个方法: 第一,由于frontend_asset_load()调用了wp_enqueue_style()来加载css文件,WordPress就会自动将版本号添加到url中,这是为了确保浏览器能够正确缓存css文件,以便在文件更新时将旧文件替换为新文件: function wp_enqueue_style( $handle, $src = '', $deps = array(), $ver = false, $media = 'all' ) { _wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle ); $wp_styles = wp_styles(); if ( $src ) { $_handle = explode( '?', $handle ); $wp_styles->add( $_handle[0], $src, $deps, $ver, $media ); } $wp_styles->enqueue( $handle ); } 第四个参数即代表指定样式表的版本号的字符串,如果它有的话,它将作为一个查询字符串添加到URL中,以达到破坏缓存的目的。如果版本号被设置为false,则会自动添加一个与当前安装的WordPress版本相同的版本号。如果设置为null,则不添加版本号。最终生成这样一条url:https://example.com/front-end/css/view/general.min.css?ver=x.x.x 第二,我们也可以通过/wp-content/plugins/essential-addons-for-elementor-lite/readme.txt进行版本探测。 确认受影响的版本以后,就是搜寻真实用户名。同样有多种方式进行探测: 使用 WordPress 的 rss feed 来提取用户名。这是一种用于发布和传递 WordPress 内容的标准格式,包含了站点的最新文章、页面、评论等内容,以及发布时间、作者、分类、标签等相关信息。这些信息可以被其他站点或应用程序订阅和使用,增加当前站点的曝光度。而其中dc:creator标签就包含了作者名称; 使用 WordPress 的 rest api 来获取用户名; 使用了 Yoast 插件提供的站点图来获取用户名。它较于第一种方法的优势在于只能获取到站点中已发布文章的作者信息。如果站点中还有其他用户没有发布文章,那么这些用户的信息是不会被获取的。 除此之外,WordPress也存在默认用户名(admin),这也是该漏洞最常利用的用户名之一。 做完上述信息收集以后,构造报文即可成功重置任意用户密码: 修复方案 在Essential Addons for Elementor(5.7.2)中,进行reset_password()操作之前,先去做了rp_key的校验。补丁如下:   ...

    2023-10-16 241
  • 实战经验 | 企业安全运营如何做好数据接入?

    1 项目背景 1.1 整体安全观 网络安全管理平台作为企业安全的大脑,也就是整个企业的安全运营中心,其数据接入的多少、好坏直接影响到安全运营的效果,如果以汽车来比喻的话,数据就是汽车的油箱或者电瓶,是保障汽车启动的动力。 1.2 安全现状 (一)数据接入不全面,告警结果不准确 企业IT资产的日志包括系统日志、中间件日志、数据库日志,安全设备日志、网络设备日志,其涉及的日志类型多、规模庞大,企业大部分未完成全部接入,存在监控死角; (二)数据量呈现过多,重要信息难发现 以10Gbps流量的举例,大概每天会产生50000条左右的日志,但是真正有效的日志只有100条以内,想要在几万条的数据中发现几十条有用的数据,无异于是大海捞针; (三)数据存在孤岛,数据无法串联 由于企业建设的阶段不同、要求不同,安全设备存在不同的安全厂商、安全设备之间能力未打通,因此无法进行关联分析,根据洛克希德马丁的杀伤链模型,攻击并不是凭空出现,安全设备的日志与系统的日志之间都是有关联的; (四)能力建设缺失,未有统一规划 安全作为业务的附属,大多数企业在投资还是管理上都存在严重不足的情况,脑海中对安全的要求是不出事就可以,但是安全不同于业务,安全平常是不可见的,只有在被攻击的时候才会体现效果; 1.3 建设依据 ...

    2023-10-10 263

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注