writeup链接: https://pan.baidu.com/s/1mip9WaG 密码: ypza
获取权限的思路:
利用密码备份文件,暴力破解
竞争
利用程序中调用的 系统调用函数如:system,popen,cmd等
溢出
资源未释放漏洞
tips:
几个描述符:0(标准输入) 1(标准输出) 2 (错误输出)3 (文件描述符)
通过向其他用户运行的程序文件中注入或添加自己的程序文件,可以实现提权操作
ll 查看文件具体权限相关
tmp 文件夹读写权限门槛最低(所有用户都可以可写可读),可以用于提权辅助
linux的shell环境下 ${变量名,,} 即可将变量转换成小写
pickle的dump之后的文件操作码: c S p0等等 pickle.loads("""cos\nsystem\n(S'ps'\ntR.""")
Linux 中的进程有父子关系,当子进程销毁时,父进程需要回收它。如果在子进程执行完毕之前,父进程因为种种原因被销毁了,那么子进程就变成了孤儿进程,收养它的是 init 进程,它的 pid 是 1。
chmod 更改权限
gdb 修改寄存器的值: set $eax=XXX
getopt相关
getopt只是一个简单的解析命令可选项的函数,只能进行简单的格式命令解析
int getopt(int argc,char* const argv[],const char* optstring);
如getopt返回-1,表示argv[]中的所有选项被解析出
optstring指定选项合法的选项,一个字符代表一个选项,在字符后面加一个':'表示该选项带一个参数
/etc/passwd相关
cat /etc/passwd 查看权限UID
传统UNIX的密码存储方式是直接在/etc/passwd(所有合法用户都可访问)里,后期版本存储在/etc/shadow(只有root可读的)
在/etc/shadow文件中的记录行内容用‘:’隔开,为:【登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志】
/etc/passwd文件存放的是用户的信息,由6个分号组成的7个信息,解释如下:
【用户名:密码(已经加密):UID(用户标识):GID(组标识):用户信息:主目录:Shell(对登录命令进行解析的工具)】
john破解密码
(Ubuntu下安装:sudo apt-get install john)
john -single shadow.txt(提取的某一行用户完整信息)
john -wordfile:password.lst -rules shadow.txt 使用字典
john -i:all shadow.txt(全部密钥空间配对)
linux环境变量
查看PATH:echo $PATH
添加变量:export PATH=/usr/local/mongodb/bin:$PATH 【只对当前shell(BASH)有效(临时的)】
/etc/profile文件中添加变量【对所有用户生效(永久的)】
在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】
修改环境变量:例如USER=“XXXXX”即可
ssh相关
实现字符界面的远程登录管理,它默认使用22号端口
简单连接方式:ssh user@hostname,或者指定端口ssh -p 10022 user@hostname,-X可以添加图形化界面功能(即可以打开某些图形化界面程序)
可以在/etc/ssh/sshd_config进行编辑,修改ssh的配置
ssh-keygen -t dsa 创建一个密钥 (ssh-keygen -F IP 查看与之配对情况)
(ssh 验证时用的私钥公钥就放在home目录中的.ssh 目录里)
某些情况下, 比如主机地址更改或者不再使用某个密钥, 你就可能需要删除某个密钥
ssh-keygen -R IP 或者手动删除 ~.ssh 文件夹
windows平台下还有putty,xshell程序可以用于ssh,ftp,telnet等连接
tar 相关
x(解压) c(加压) t(打开压缩包)
-v 显示压缩文件
-z 以gzip方式压缩(一般格式为xx.tar.gz或xx. tgz)
-j 以bzip2方式压缩(一般格式为xx.tar.bz2)
-f :使用档名
设置压缩目录:-C dir(参数的作用在于改变工作目录) 如:tar -cvf file2.tar -C /home/usr2 file2
php的preg_replace相关
第一个参数后使用了/e,即启用/e 模式,那么 preg_replace 的第二个参数将会被作为代码执行。(/e 这个修饰符的意思 就是让 正则替换的 时候 替换规则 支持 php 代码)
在 php 变量引用中,如果双引号的字符串出现了“$变量名”或“${变量}”的形式,最终引用的是变量值。同样的思想,如果是函数,则引用的是函数的返回结果。
“\”主要用于转义,“/”主要用于描述模式。
linux下的find
find / -uid 扫描当前目录以及其子文件,查找符合UID值的文件(例如find / -uid 999 2>/dev/null)
-name filename #查找名为filename的文件
-user username #按文件属主来查找
-group groupname #按组来查找
ln 链接指令使用
-s:进行软链结(symboliclink) (软连接可以跨文件系统,可以对一个不存在的文件名进行连接)
不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁盘空间
ln -s abc cde #建立abc 的软连接
ln abc cde #建立abc的硬连接
rm -rf XXX #用于删除链接
nice — 调整程序运行的优先级
nice -n 19 表示改变文件的执行优先级,范围是-20~19,数字越低,优先级越高
access函数用于检测文件存在与读写权限,windows下在<io.h>导入,linux在<unistd.h>导入
fread()与fwrite()
size_t fread(void*ptr, size_t size, size_t nmemb,FILE* stream);
size_t fwrite(const void* ptr,size_t size,size_t nmemb,FILE* stream);
返回值:读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录,数小于nmemb,也可能返回0。参数size指出一条记录的长度,而nmemb指出要读或写多少条记录.
strace 命令可跟踪一个程序的系统调用
Linux 里动态链接库的文件名是以“.so.版本”号结尾的,如:libc.so.6。当要调用动态链接库时,先用dlopen 函数打开它。之后动态链接库的入口函数首先得到执行,在 Win32 编程中,DLL 的入口函数是DllMain(好久没搞 Windows 编程了,如果没有记错的话),Linux 的动态链接库的入口是_init。_init 函数是在 gcc 命令编译时自动加入的,主要做一些全局变量之类的初始化操作。
通过__attribute ((constructor)),这是 gcc的一个特性,可以让程序在执行_init 函数之前,就先执行带有__attribute ((constructor))的函数
gcc -fpic -shared -nostdlib libc.c -o libc.so.6. (加上-nostdlib 就可以消除“version GLIBC_2.1.3 not defined in file libc.so.6 with link timereference”提示了)
使用汇编自动写成一个system(在一些时候不能直接使用系统调用)
动态链接库的写法