本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试加入交流群讨论或留言私信,如有侵权请联系小编处理。
2、内容速览
因为Linux发行版众多,但不同分支直接大部分核心命令都是相同的,所以下面我会选择大量服务中都在使用的用的Linux发行版CentOS7和另中一个市场占有率较高的发行版乌班图作为示例!下列大多数命令都可以在乌班图20和contos7中正常运行!
uname -a
: 此命令可以查看当前Linux系统内核具体版本、使用的发行版版本、以及当前处理器架构!(这里的架构非常重要,大部分针对Linux攻击载荷都需要明确处理器架构才能使用)32位系统(x86): i386,i686,x86,arm 64位系统(x64):x64,x86_64,amd64,arm64,aarch64
众所周知Linux是一个文件系统,所有信息都会已文件形式存在,所有我们的系统信息很多也在文件中能直接看到!(使用cat
命令查看文件)
cat /etc/issue
: 连接系统时显示的提示信息,默认一般会存放发行版名称等信息(PS:用户可能会把这个当成备忘录存放一些口令)cat /etc/*-release
: 详细的发行版系统版本信息(不同的发行版可能名字会略有不同,并且此文件可能有多个,这种情况下我们可以使用通配符*
来解决这个问题。ls /etc | grep "release""
可以使用此命令来查看你系统中此文件夹具体有哪些!)cat /proc/version
: 详细的系统内核信息,用于编译内核的gcc的版本以及内核编译的时间。cat /proc/sys/kernel/version
: 系统内核信息,相当uname -v
(/proc/sys/kernel
文件夹中可以监视和调整Linux内核中的各种活动!但需要管理员权限!)ps
: 列出本用户当前使用的终端中运行的进程ps -elf
: 显示详细的(-l
)带UID,PPIP,C与STIME栏位(-f
)现行终端机下的所有进程(-e
)ps aux
: 已用户为主的格式(u
)显示所有用户(a
)的所有终端机(x
)下的所有进程`/proc`: 此文件夹中已数字命名的文件夹就是正在运行进程的UID,除了这些UID外此文件夹中还包含了例如系统内存,安装的设备,硬件配置等信息!
# 查看此文件夹中所有文件和文件夹的详细信息
ls -al /proc/
# 查看uid为99的进程的详细信息
ls -al /proc/99
id
: 相比于whoami
,id
会更加实用,我们不仅可以看到当前用户是谁,还能看到他在哪个组中!就算非root用户,只要在root组中,那也是一个高权限的管理员用户!w
: 当前已登录到服务器中的人员。last
: 用户登录记录lastd
: 登录失败的用户记录lastlog
: 所有用户上次登录日志who
: 当前已登录的用户信息(会显示本用户最近的登陆时间和日期)cat /etc/passwd
: 可以登录系统或其他拥有正在运行的进程的操作系统的用户身份信息。cat /etc/shadow
: 所有用户的密码安全策略,一般只有超级用户对此文件夹才有访问权限!cat /etc/sudoers
: 对权限的分配管理
sudo -V
: 打印sudo版本字符串sudo -l
: 列出目前用户可执行与无法执行的指令(其中(ALL:ALL) ALL
代表所有的命令)ifconfig -a
: 查看网络、网卡相关信息hostname
: 显示、设置系统的主机名称netstat -anutp
或netstat -antpx
或netstat -tulpn
: 查看所有使用的(-a
)TCP(-t
)UDP(-u
)的端口的程序识别码以及程序名称(-p
)和对应连接的IP地址(-n
) ;其中-x
相当与-A unix
;-l
是显示监控中的服务器的Socket。需要管理员权限lsof -nPi
: 列出当前使用网络文件系统(net file system,简称NFS)的文件(-n
)的PID(-P
)和进程(-i
)需要管理员权限。使用lsof -nPi:端口号
可以查看指定端口的信息!route -e
: IP 路由表cat /etc/resolv.conf
: 域名解析服务(DNS)的配置文件cat /etc/hosts
: 和Windows中host文件作用相同,将IP地址与主机名相关联的文本形式数据库,我们可以使用此文件来尝试寻找邻近目标有时候我们打进目标内部想看看是否有内网主机,可以使用此脚本自动ping进行一次c端扫描!
#!/bin/bash
for i in {<!-
- -->2..254}
do
{<!-
- -->
ip=192.168.1.$i
ping -c1 -W20 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip"|tee -a ip.txt
else
echo "$ip"失败!!
fi
}&
done
wait
echo "完毕"
Linux大量重要信息都直接存放在文件中,我们可以通过查看这些关键地方的信息来收集我们需要的数据!
cat /etc/profile
: Linux系统环境和启动程序。包含启动控制台(bash
、sh
)等信息。用户换机和启动程序可以使用cat ~/.bash_profile
cat /etc/bash*
: 使用bash控制台的启动文件。是使用系统广泛的功能和别名。(这里可能是/etc/bashrc
或者 /etc/bash.bashrc
,所有使用通配符代替)cat ~/.bash_history
: 打印当前用户bash命令的历史记录(也可以直接输入history
查看)1. ls -al /var/log/
: 列出所有日志文件chmod 权限管理 语法:chmod [{ugoa}{+-=}{rwx}] [文件或目录]chmod a+rwx 文件名/文件夹名
u:所有者 g:所属组 o:其他人 a:所有人 +:为用户增加权限 -:为用户减少权限 =:为用户赋予权限 r:读权限 w:写权限 x:执行权限
或:chmod [mode=421] [文件或目录]chmod 777 文件名/文件夹名
r为读权限,可以用4来表示。 w为写权限,可以用2来表示。 x为执行权限,可以用1来表示。无任何权限可以使用0表示!
-R 递归修改(就是将嵌套在很多文件夹中的文件权限修改了,如果没有这个,只能到指定的文件夹下进行修改)
当我们使用ls -la
就能看到当前目录中所有文件和文件夹的权限设置。
权限一共是10个字符,第1个字符分为1组,后面9个字符分为3组。比如:d rwx r-x r-x
# 示例:
-rw----
--
- (600) <--> 只有属主有读写权限。
-rw-r--r-
- (644) <--> 只有属主有读写权限;而属组用户和其他用户只有读权限。
-rwx----
-
- (700) <--> 只有属主有读、写、执行权限。
-rwxr-xr-x (755) <--> 属主有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) <--> 属主有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw
- (666) <--> 所有用户都有文件读、写权限。
-rwxrwxrwx (777) <--> 所有用户都有读、写、执行权限。
linux的权限设置较为复杂,所有有一个在线网站(https://chmodcommand.com/)专门提供了一个自动生成权限管理的功能。
特殊的权限,分别为:setuid、setgid和粘滞位(stick bit)
u+s
或4
g+s
或2
o+t
或1
-rwxrwxrwx (777) <--> 所有用户都有读、写、执行权限。
-rwsrwxrwx (4777) <--> 所有用户都有读、写、执行权限,并且所有用户都会已经属主身份运行。
-rwxrwsrwx (2777) <--> 所有用户都有读、写、执行权限,并且所有用户都会已经属组身份运行。
-rwxrwxrwt (1777) <--> 所有用户都有读、写、执行权限,但只有属主对此文件有删除和修改的权限。
-rwsrwsrwt (7777) <--> 所有用户都有读、写、执行权限,已属主和属组身份运行,只有创建者对文件有删除修改权限。
比如一个权限为-rwxr-xr-x
的文件设置所有特殊权限后会变成-rwsrwsrwt
,但如果出现大写字母,则表示未给指定组执行权限,导致特殊权限失效!
# 粘滞位
- 只有目录的所有者或文件的所有者可以在这里删除或重命名。(-type d: 文件夹目录类型)
find / -perm -1000 -type d
# SGID(chmod 2000)
- 作为属组运行的文件,而不是启动它的用户。(-type f: 一般文件类型)
find / -perm -g=s -type f
# SUID(chmod 4000)
- 作为属主运行的文件,而不是启动它的用户。
find / -perm -u=s -type f
# 找出可写可执行的文件夹
find / -perm -o=w -perm -o=x -type d
# 找出可写的文件夹
find / -xdev -type d -perm -0002 -a ! -perm -1000 -print
# 找出不是所有者的文件
find / -xdev -nouser -o -nogroup -print
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
输入systemctl status cron*
查看当前计划任务服务是否正常运行!(因为不同系统的cron服务名可能略有区别,所以这里用通配符来解决不同系统的问题!)
输入crontab -l
查看当前用户设置的定时任务
定时任务存放的目录/文件:/etc/crontab
: 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab!
/var/spool/cron
: 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名。
# 设置定时任务
crontab -e
# 或
vim /etc/crontab
# 如每天晚上11点到早上7点之间,每小时执行一次/root/backup.sh脚本,并将输出内容导出到/var/backup_log.txt
* 23-7/1 * * * root /root/backup.sh >> /var/backup_log.txt
月份
字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。分钟
字段,表示每十分钟执行一次。systemctl
、 service
和 chkconfig
都是和系统服务有关的指令
其中systemctl
是在 service
和 chkconfig
出现的
主要用一个命令来取代后面两个命令的功能,所以较新的Linux版本中主要是已systemctl
为主,而老版本则是比较适用service
和 chkconfig
service --status-all
: 查看所有服务状态systemctl list-units --type service -a
: 查看当前已装载的所有服务(将list-units
换成list-unit-files
可以查看所有已安装的服务)service 服务名 start
或 systemctl start 服务名
: 启动某服务(我们是使用systemctl
查询的服务格式都为服务名.service
,但我们使用的时候是不用携带后缀.service
的)service 服务名 stop
或 systemctl stop 服务名
: 停止某服务service 服务名 restart
或 systemctl restart 服务名
: 重启某服务service 服务名 status
或 systemctl status 服务名
: 某服务的当前状态service 服务名 restart
或 systemctl restart 服务名
: 重启某服务systemctl try-restart 服务名
: 仅当服务运行的时候,重启服务systemctl relaod 服务名
: 重新加载服务配置文件cat /etc/services
: 将端口号映射到指定服务。(可以使用grep 端口号 /etc/services
查询指定端口的端口开放的服务!)
当前连接Linux大部分操作都是直接使用SSH这个服务进行的,这个服务不仅高效安全,还有很多便利的功能。
而其中有一个免密登陆的功能会经常被我们那里利用,可以绕过用户登录密码来直接连接目标主机
想要实现这个功能首先我们需要查看目标机器是否开启了一些我们需要的功能:
# 配置服务端ssh(客户端是ssh_config文件)
vim /etc/ssh/sshd_config
# 在配置文件中打开如下几个选项
# 允许RSA身份验证
RSAAuthentication yes
# 允许公钥身份验证
PubkeyAuthentication yes
# 允许使用管理员权限登陆
PermitRootLogin yes
# [可选]禁用密码登录
PasswordAuthentication no
# 设置完上述配置后,输入:wq保存退出后需要重启ssh服务
service sshd restart
完成上述步骤后,我们可以先查看一下目标机器是否有~/.ssh/
目录(如果权限足够可以直接看/root/.ssh/
目录)
如果不存在此目录一般就表示还没有生成免密登陆的秘钥!这里就需要使用命令ssh-keygen
来申请秘钥。
此目录中一般会有两个文件,分别是私钥id_rsa
和公钥id_rsa.pub
,但除此之外,这里还需要一个authorized_keys
文件。
我们可以把整个免密过程看做是一个指纹锁,其中authorized_keys
文件是这个指纹锁的数据库,其中公钥id_rsa.pub
是可以存在数据库中的你的指纹数据,而私钥id_rsa
则是你的手指。
打开这个指纹锁常见的有两种方法。
authorized_keys
# 将我们的公钥添加到authorized_keys文件中
echo 公钥(我们的id_rsa.pub文件内容) >> ~/.ssh/authorized_keys
# 之后直接用本机对目标进行ssh连接即可
这种方法就相当于我们把我们自己的指纹录入到目标的数据库中,也就是把id_rsa.pub
文件保存到对方的authorized_keys
中。
我们自己的公钥也需要使用ssh-keygen
来生成,如果是Windows也没关系
Windows10之后的系统都自带ssh!默认路径在C:\Users(中文版系统里是用户)/用户名(这里每个人都不一样)\.ssh
方法二: 将对方的公钥数据添加到到对方的authorized_keys
中,然后将对方的id_rsa
下载到本地来伪造对方的手指
# 将目标机器公钥添加到authorized_keys中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 我们需要下载id_rsa文件,下载文件的方法有很多,这里提供一个Python的方法来下载目标文件
# 在.ssh目录下使用python的服务可以开启一个直接能访问的地址用来下载我们需要的文件
python3 -m http.server
# 使用ssh连接
ssh 目标用户名@目标地址 -i id_rsa
# 比如
ssh xunmi@192.168.1.149 -i C:\Users\xunmi\Desktop\网安\id_rsa
这种方法相当于伪造了一个一模一样的目标指纹id_rsa
这种方法还一个好处就是如果目标机器用户是一个系统管理员
那么他的私钥可能能登陆目标很多的常用机器!
Linux系统中的安装服务主要是包过滤防火墙netfilter
!我们一般会使用工具iptables
来对他进行管理操作。iptables -L
: 列出所有规则链(需要管理员权限)iptables -F
: 删除选定规则链中的所有规则
添加参数简介:-A
: 添加端口,常用-A OUTPUT
表示输出端口和-A INPUT
表示输入端口-p
: 协议类型,常见协议类型有-p icmp
、-p tcp
、-p udp-m
: 扩展模块(加载扩展),常用的比如-m state –state NEW,RELATED,ESTABLISHED--sport 端口号
或-m 协议类型(如tcp) -sport 端口号
: 指定来源端口号--dport 端口号
或-m 协议类型(如tcp) -dport 端口号
: 指定目标端口号-j
: 满足前置条件时执行的动作。比如 放行(-j ACCEPT
); 拦截(-j DROP
、-j REJECT
),其中使用-j DROP
拦截会返回一个错误提示,而-j REJECT
则不会。-s
: 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。-d
: 匹配目标地址
# 允许本机所有端口向外的访问
iptables -A OUTPUT -j ACCEPT
# 允许所有外部机器访问本机
iptables -A INPUT -j ACCEPT
# 允许外部机器已TCP协议访问本机的80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许接收的UDP协议从53端口访问本机
iptables -A INPUT -p udp -m udp -sport 53 -j ACCEPT
# 允许本机从53端口的发出UDP协议
iptables -A OUTPUT-p udp -m udp –dport 53 -j ACCEPT
# 允许被ping(icmp为ping使用的协议)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# 运行所有主机连接到9999端口
iptables -A INPUT -p tcp -m tcp –sport 9999 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp –dport 9999 -j ACCEPT
# 允许192.168.1.*网段的的所有内网机器访问本机
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT
# 允许本机访问192.168.1.*网段的所有的机器
iptables -A INPUT -p all -d 192.168.1.0/24 -j ACCEPT
正常情况下,我们操作Linux默认是从键盘输入信息,而需要显示的信息会显示在我们的屏幕上,而我们可以利用重定向符来改变这个正常状况。
符号 | 含义 | 具体作用 | |
---|---|---|---|
< | 输入重定向 | 从文件读取输入。 | |
> | 输出重定向 | 将输出保存到文件。(会覆盖已存在的文件) | |
>> | 输出重定向 | 将输出追加到文件。(文件已存在的话会追加,而不会覆盖) | |
| | 管道 | 将一个程序输出作为输入发给另一个程序 |
# 比如我想将ls输出的结果保存在`目录状况.txt`文件中
ls > 目录状况.txt
# 将另一个目录也保存进来
## 追加保存
ls ../ >> 目录状况.txt
## 覆盖保存
ls ../ > 目录状况.txt
# 输入重定向
## 我们将`目录状况.txt`写到`test`变量中(变量不支持换行,所以只能保存第一行内容),0是标准文件操作符的输入
read test < 目录状况.txt
# 管道符,可以将前面的输出当做后面命令的输入(wc是用来统计文件字数,行数的命令!)
echo "abc" | wc
Linux基本哲学之一就是“一切皆文件”。Linux启动的时候会默认打开三个文件描述符(输入、输出、错误输出)。我们在和Linux之间的交互就是依靠这三个文件描述符进行的。
|文件描述符|英文名|描述|默认使用设备| |--|--|--| |0|STDIN|标准输入|设备默认键盘(/dev/tty0
) |1|STDOUT|标准输出|设备默认显示器(/dev/tty0
) |2|STDERR|标准错误输出|设备默认显示器(/dev/tty0
)
文件描述符0: 我们对Linux系统进行的输入操作(比如我想查看文件列表的时候,输入的ls。) 文件描述符1: Linux系统给我们返回的输出(比如我输入ls后,系统给我返回的当前目录中文件的信息) 文件描述符2: Linux系统给我们返回的错误的输出
eaho "123" 1>标准输出.txt
错误命令 2>错误输出.txt
>
和>>
是1>
和1>>
的缩写,也就是说默认情况下,只会重定向标准输出,而非报错信息1. <
是0<
的缩写&>
或>&
(效果完全相同)find /run -perm -1000 -type d &> 文件操作符.txt
find /run -perm -1000 -type d >& 文件操作符.txt
可以看成,正常情况下,我们重定向符号格式是文件描述符>文件
但我们可以使用&来告诉终端
后面的也是一个文件描述符文件描述符>&文件描述符
(这里不能带括号!)。比如2>&1
,就是将标准错误输出
重定向到标准输出
!
还拿find /run -perm -1000 -type d
这个命令举例,除了上述的写法,我们还可以将标准错误输出
也重定向到标准输出
的输出地方!
find /run -perm -1000 -type d > 文件操作符.txt 2>&1
PS: ...> 文件操作符.txt 2>&1
最好在最后使用重定向文件描述符!命令默认都会从左往右依次执行,如果不是在最后可能会比较绕。别把自己绕进去就好。
除了0,1,2
这三个描述符外,我们是可以自定义新的文件描述符的exec 文件描述符<>文件
# 比如我自定义一个文件描述符3,并指向`我的文件描述符`
exec 3<>我的文件描述符
pwd >&3
cat 我的文件描述符
基于Linux中万物皆文件的特性,在Linux中我们可以找到一些非常有趣的文件,对我们的渗透测试也会有一定的帮助,甚至有些文件的存在对渗透测试非常重要!
/dev/tcp/IP/端口
: 在linux中我们建立的TCP连接也是已文件的形式存在的,Linux中大多数的反向shell就是利用这个特性建立的!
/dev/tty
: 我们使用的ssh命令行登陆的终端在Linux中也是已一个文件的形式存在的,我们每次连接一个终端,都会新建一个终端文件比如建立第一个的时候就是/dev/tty1
,还有一个非常特殊的终端指向文件/dev/tty0
他指定是当前我们正在使用的终端。默认情况下我们文件操作符都是指向/dev/tty0
这个终端的!/dev/tty
相关的文件属主都是tty,root用户都无权操作。
/dev/null
: (还一个特殊文件/dev/zero
我们暂时用不到,有兴趣的可以自行百度)黑洞文件,正如他的名字那样他会吞噬一些进入他的内容,并返回保存成功的信号,但其实保存进去的内容都被丢弃了。有一个比较常用的写法是2>/dev/null
,他将所有报错扔到黑洞中消除,这样就只会输出非报错的内容了!
echo "123" 2>/dev/null
报错内容 2>/dev/null
比如我们在提权操作时可能会用到一个查看文件特定权限的命令find / -perm -1000 -type d
但此时会报出很多权限不够的错误,这些信息对我们毫无作用
反而会影响我们找到我们需要的信息,这时候就可以使用上述空文件来将报错信息全部删除掉find / -perm -1000 -type d 2>/dev/null
[0]参考文章:https://xunmi.blog.csdn.net/article/details/114970239
[30]在线网站:https://chmodcommand.com/