月度归档:2011年04月

CentOS 安装proftpd并实现虚拟用户

classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui>

下载proFTPD最新版:
官网地址:http://www.proftpd.org
wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.4rc2.tar.gz
解压安装:
# cd proftpd-1.3.4rc2
# ./configure –prefix=/usr/local/proftpd –with-modules=mod_quotatab:mod_quotatab_file
# make
# make install
# cp contrib/ftpasswd /usr/local/proftpd/bin/
# cp contrib/ftpquota /usr/local/proftpd/bin/
配置proftpd:
#vim /usr/local/proftpd/etc/proftpd.conf
其他的不改为默认:

AllowOverwrite             on        #设置文件可以被覆盖
AllowForeignAddress     on      #
支持FXP
PassivePorts   49152 65534       #
支持被动模式
AllowRetrieveRestart on           #
允许下载续传,默认即开启
AllowStoreRestart on              #
允许上载续传
RequireValidShell off   #
不要求有合法shell,直接效果是允许nologin用户和虚拟用户登录
AuthOrder mod_auth_file.c mod_auth_unix.c
AuthUserFile /usr/local/proftpd/etc/passwd
禁用匿名用户:

# A basic anonymous configuration, no upload directories.  If you do not
# want anonymous users, simply delete this entire <Anonymous> section.
#<Anonymous ~ftp>
#  User                         ftp
#  Group                                ftp
#
#  # We want clients to be able to login with "anonymous" as well as "ftp"
#  UserAlias                    anonymous ftp
#
#  # Limit the maximum number of anonymous logins
#  MaxClients                   10
#
#  # We want ‘welcome.msg’ displayed at login, and ‘.message’ displayed
#  # in each newly chdired directory.
#  DisplayLogin                 welcome.msg
#  DisplayChdir                 .message
#
#  # Limit WRITE everywhere in the anonymous chroot
#  <Limit WRITE>
#    DenyAll
#  </Limit>
#</Anonymous>

添加虚拟用户:
# /usr/local/proftpd/bin/ftpasswd –passwd –name=ftptest –uid=99 –gid=99 –home=/home/web/ftptest –shell=/sbin/nologin –file=/usr/local/proftpd/etc/passwd

Password: <new password>
Re-type password: <new password>
之后会自动生成/usr/local/proftpd/etc/passwd

# chmod -R 777 /home/web/ftptest

至此配置完全,登录#ftp localhost验证是否正常

 

常用全局设置:
  DefaultRoot ~ # 限制每个FTP用户在自己的目录下,不可查看上一级目录
  AllowRetrieveRestart on #下载时,允许断点续传
  AllowStoreRestart on #上传时,允许断点续传
  ServerIdent off #屏蔽服务器版本信息
  TransferRate STOR RETR 速度(Kbytes/s user 使用者 #设定用户传输速率
  MaxHostsPerUser 1 #每个帐户最多允许来源ip1, 对防止ftp帐号还是比较有用的。
  MaxClientsPerUser 1 #每个帐户在每个客户端最多可以同时登陆1,可以防止多线程软件下载对服务器的破坏。
  MaxClientsPerHost 1 #同一个客户端只能最多1个帐号可以登陆
  WtmpLog on #是否要把ftp记录在日志中,如果不想可以设置成off屏蔽掉log日志。
  TimeoutIdle 600 #客户端idle时间设置,默认就是600
  DisplayLogin welcome.msg #设置ftp登陆欢迎信息文件
RootLogin on #
允许root用户登录,默认是不允许的,安全起见不推荐此选项。

 

 

 

清除、破解LINUX ROOT的密码

 (一)RedHat/CentOS/Fedora 系统密码破解   1.在grub选项菜单按E进入编辑模式   2.编辑kernel 那行最后加上S (或者Single)   3.按B,启动到single-user mode   4.进入后执行下列命令   # mount -t proc proc /proc   # mount -o remount,rw /   #passwd   #sync   #reboot   (二)Debian linux 系统密码破解   1.在grub选项菜单’Debian GNU/Linux,…(recovery mode)’,按e进入编辑模式   2.编辑kernel那行最后面的 ro single 改成 rw single init=/bin/bash,按b执行重启   3.进入后执行下列命令   root@(none)#mount -a   root@(none)#passwd root   root@(none)#reboot   (三)Freebsd 系统密码破解   1.开机进入引导菜单   2.选择每项(按4)进入单用户模式   3.进入之后输入一列命令   root@#mount -a   root@#fsck -y   root@#passwd(修改密码命令)   root@#root(要破解密码的用户名)   Enter new unix password:   root@#init 6 (重启)   (四)Solaris 系统密码破解   1.在grub选项菜中选择solaris failasfe 项   2.系统提示Do you wish to have it mounted read-write on /a ?[y,n,?] 选择y   3.就进入单用户模式   4.输入下列命令:passwd   root@#init 6 (重启)   (五)NetBsd 系统密码破解   1.开机:当出现提示符号并开始倒数五秒时, 键入以下指令:   > boot -s (进入单用户模式命令)   2.在以下的提示符号中   Enter pathname of shell or RETURN for sh:   按下 Enter。   3.键入以下指令:   # mount -a   # fsck -y   4.使用 passwd 更改 root 的密码。   5.使用 exit 指令进入多人模式。   (六)SUSE 系统密码破解   1.重新启动机器,在出现grub引导界面后,在启动linux的选项里加上init=/bin/bash,通过给内核传递init=/bin/bash参数使得OS在运行login程序之前运行bash,出现命令行。   2.稍等片刻出现(none)#:命令行。   3.这时输入mount -n / -o remount,rw 表示将根文件系统重新mount为可读写,有了读写权限后就可以通过passwd命令修改密码了。   4.这时输入passwd命令就可以重置密码了   5.修改完成后记得用mount -n / -o remount,ro将根文件系统置为原来的状态。 

tcpdump,ssldump

软件简介:

    tcpdump是一款很强大、很有用的网络侦听软件,但是对于ssl加密的数据包就无能为力了;ssldump则是一款可以侦听ssl加密的数据包的软件。

    下载地址:

    wget "http://www.rtfm.com/ssldump/ssldump-0.9b3.tar.gz"

    安装:

    安装时曾遇到这种错误:

    ./base/pcap-snoop.c:52:21: net/bpf.h: No such file or directory

    ./base/pcap-snoop.c: In function `main\':

    ./base/pcap-snoop.c:207: warning: passing arg 2 of `signal\’ from incompatible pointer type

    ./base/pcap-snoop.c:329: warning: passing arg 3 of `pcap_loop\’ from incompatible pointer type

    make: *** [pcap-snoop.o] Error 1

    因为该软件依赖libpcap包,下载地址:http://www.tcpdump.org/release/libpcap-1.0.0.tar.gz

    我的机器上虽然已经按照了libpcap包,但是net/bpf.h 却不存在,但是存在pcap-bpf.h ,于是我就将pcap-bpf.h重命名为bpf.h 放到了net目录下,编译通过。

vm下压缩linux虚拟机

今天要刻录一个虚拟机给别人,发现虚拟机太大了,一张DVD无法装下,决定压缩一下虚拟机,用vmware-tools对虚拟机压缩
1.在linux下安装vmware-tools
加载vmware-tools光盘,点击intall vmware tools后vmware会自动把vmware-tools的镜像加到虚拟机的光驱中.
挂载cdrom:
#mkdir /mnt/cdrom
#mount /dev/cdrom /mnt/cdrom
#cd /mnt/cdrom
#cp VMwareTools-8.4.2-261024.tar.gz ..
#cd ..

#tar -xvf  VMwareTools-8.4.2-261024.tar.gz
解压后生成目录vmware-tools-distrib,进入该目录
#cd vmware-tools-distrib
#安装
#./vmware-install.pl
出现各种提示,按提示输入所要的信息……..
安装成功后运行#vmvare-toolbox,由于我禁用了图形界面,没办法启动,只有用命令行来执行.

#vmware-toolbox-cmd disk shrink /

压缩我的虚拟机的根目录

#6.96G的虚拟机一下子压缩到了3.8G

大小: 109.83 K
尺寸: 500 x 362
浏览: 1 次
点击打开新窗口浏览全图

base64_encode 和 urlencode,使用base64应该注意的问题

base64编码是网络传输的比较被青睐的一种编码,因为base64编码的字符集也是基本的asscii字符,所以经常会被当做安全的编码放在url里面传输,当做urlencode编码使用了,其实我们应该明白一下两点:

    1. base64编码里面有一个 “+” 号,在urlecode编码中 “+” 会被解码成空格,urlencode时,"+" 号肯定是由空格编码出来的,但是base64编码的结果中 "+" 不是空格编码出来的,如果将base64编码作为安全的url编码使用,则 “+” 将被解码成空格,这是我们不愿看到的; 所以不要base64编码作为url编码来使用

    2. 我们知道http头里面可能会用base64编码来传输一些信息,因为这些信息不会被web服务器默认做url解码的,我们可以得到原始的编码信息,所以http头里面使用base64编码是可以接受的

修改linux用户登录后默认目录

把用户ftp的默认目录修改为/home/ftp
方法一:
命令修改
# usermod -d /home/ftp ftp
方法二:
直接修改passwd文件
#vim /etc/passwd
找到ftp用户所在行,修改:
ftp:x:1002:1002::/home/web:/bin/sh改为:ftp:x:1002:1002::/home/ftp:/bin/sh

Linux系统下用smbclient命令来访问Windows共享(转)

加上在命令前加!会执行本地的命令 如 :
\>!pwd 是查询当前的本地所在目录
\>pwd 查询远端ftp所在目录
测试平台:
Red Hat Enterprise Linux AS release 3 (Taroon)
Windows 2000 Advanced Server SP4
当前测试条件:
1、 Windows和Linux共处于同一个局域网中,可以互相ping通,都未设置防火墙
2、 Windows的IP地址:192.168.60.188
3、 Linux的IP地址:192.168.60.189
4、 Windows上当前有如下共享:c$,temp(everyone具有读取权限)
5、 Windows上的用户有cmw(管理员组用户帐号),grp(管理员组用户帐号),guest(当前未启用),没有root帐号
6、Linux上安装有相关的RPM包:,它是Samba客户端工具
7、Debian下安装,apt-get install samba-client

1、 访问c$共享:
[root@rh root]# smbclient //192.168.60.188/c$ -U cmw
Password:
smb: \> cd winnt
smb: \winnt\>
2、 访问temp共享(启用guest帐户)
[root@rh root]# smbclient //192.168.60.188/temp
Password:(未输入任何密码)
smb: \>
3、 访问temp共享(未启用guest帐户)
[root@rh root]# smbclient //192.168.60.188/temp
Password:(未输入任何密码)
Anonymous login successful
tree connect failed: NT_STATUS_ACCESS_DENIED
[root@rh root]#
扩展研究:
1、 smbclient命令成功后,可以使用的命令及研究:
[root@rh root]# smbclient //192.168.60.188/temp -U cmw
Password:
smb: \> ?
? altname archive blocksize cancel
cd chmod chown del dir
du exit get help history
lcd link lowercase ls mask
md mget mkdir more mput
newer open print printmode prompt
put pwd q queue quit
rd recurse reget rename reput
rm rmdir setmode symlink tar
tarmode translate !
以上为可以使用的命令,常用命令如下:
1) ?命令
smb: \> ? ?
HELP ?:
[command] give help on a command
语法:? [command]
功能:可以查看一个命令的使用方法
2) cd命令
smb: \> ? cd
HELP cd:
[directory] change/report the remote directory
smb: \> cd samba
语法:cd [directory]
功能:改变远程目录
3) du命令
smb: \samba\> ? du
HELP du:
computes the total size of the current directory
smb: \samba\> du
42293 blocks of size 1048576. 5098 blocks available
Total number of bytes: 16880894
语法:du
功能:统计当前目录下文件总计大小,不包括子目录容量。

Linux下patch的制作和应用

首先介绍一下diff和patch。在这里不会把man在线文档上所有的选项都介绍一下,那样也没有必要。在99%的时间里,我们只会用到几个选项。所以必须学会这几个选项。
1、diff
    --------------------
    NAME
           diff – find differences between two files
    SYNOPSIS
           diff [options] from-file to-file
    --------------------
    简单的说,diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。语法格式:diff 【选项】 源文件(夹) 目的文件(夹),就是要给源文件(夹)打个补丁,使之变成目的文件(夹),术语也就是“升级”。下面介绍三个最为常用选项:
    -r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。
    -N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。
    -u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。
2、patch
    ------------------
    NAME
       patch – apply a diff file to an original
    SYNOPSIS
           patch [options] [originalfile [patchfile]]
           but usually just
           patch -pnum
    ------------------
    简单的说,patch就是利用diff制作的补丁来实现源文件(夹)和目的文件(夹)的转换。这样说就意味着你可以有源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。下面介绍几个最常用选项:
    -p0 选项要从当前目录查找目的文件(夹)
    -p1 选项要忽略掉第一层目录,从当前目录开始查找。
************************************************************
在这里以实例说明:
— old/modules/pcitable       Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable       Tue Dec 19 20:05:41 2000
    如果使用参数-p0,那就表示从当前目录找一个叫做old的文件夹,在它下面寻找modules下的pcitable文件来执行patch操作。
    如果使用参数-p1,那就表示忽略第一层目录(即不管old),从当前目录寻找modules的文件夹,在它下面找pcitable。这样的前提是当前目 录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可以用绝 对路径。不过我一般习惯用相对路径。
************************************************************
-E 选项说明如果发现了空文件,那么就删除它
-R 选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)
下面结合具体实例来分析和解决,分为两种类型:为单个文件打补丁和为文件夹内的多个文件打补丁。
环境:在RedHat 9.0下面以armlinux用户登陆。
目录树如下:
    |– bootloader
    |– debug
    |– images
    |– kernel
    |– program
    |– rootfiles
    |– software
    |– source
    |– sysapps
    |– tmp
    |– tools
下面在program文件夹下面建立patch文件夹作为实验用,然后进入patch文件夹。
一、为单个文件进行补丁操作
1、建立测试文件test0、test1
[armlinux@lqm patch]$ cat >>test0> 111111
> 111111
> 111111
> EOF
[armlinux@lqm patch]$ more test0
111111
111111
111111
[armlinux@lqm patch]$ cat >>test1> 222222
> 111111
> 222222
> 111111
> EOF
[armlinux@lqm patch]$ more test1
222222
111111
222222
111111
2、使用diff创建补丁test1.patch
[armlinux@lqm patch]$ diff -uN test0 test1 > test1.patch
【注:因为单个文件,所以不需要-r选项。选项顺序没有关系,即可以是-uN,也可以是-Nu。】
[armlinux@lqm patch]$ ls
test0 test1 test1.patch
[armlinux@lqm patch]$ more test1.patch
************************************************************
patch文件的结构
补丁头
补丁头是分别由—/+++开头的两行,用来表示要打补丁的文件。—开头表示旧文件,+++开头表示新文件。
一个补丁文件中的多个补丁
一个补丁文件中可能包含以—/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。

块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。
块的缩进
块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。
块的第一列
+号表示这一行是要加上的。
-号表示这一行是要删除的。
没有加号也没有减号表示这里只是引用的而不需要修改。
************************************************************
***diff命令会在补丁文件中记录这两个文件的首次创建时间,如下***
— test0       2006-08-18 09:12:01.000000000 +0800
+++ test1       2006-08-18 09:13:09.000000000 +0800
@@ -1,3 +1,4 @@
+222222
111111
-111111
+222222
111111
[armlinux@lqm patch]$ patch -p0 patching file test0
[armlinux@lqm patch]$ ls
test0 test1 test1.patch
[armlinux@lqm patch]$ cat test0
222222
111111
222222
111111
3、可以去除补丁,恢复旧版本
[armlinux@lqm patch]$ patch -RE -p0 patching file test0
[armlinux@lqm patch]$ ls
test0 test1 test1.patch
[armlinux@lqm patch]$ cat test0
111111
111111
111111
二、为多个文件进行补丁操作
1、创建测试文件夹
[armlinux@lqm patch]$ mkdir prj0
[armlinux@lqm patch]$ cp test0 prj0
[armlinux@lqm patch]$ ls
prj0 test0 test1 test1.patch
[armlinux@lqm patch]$ cd prj0/
[armlinux@lqm prj0]$ ls
test0
[armlinux@lqm prj0]$ cat >>prj0name> ——–
> prj0/prj0name
> ——–
> EOF
[armlinux@lqm prj0]$ ls
prj0name test0
[armlinux@lqm prj0]$ cat prj0name
——–
prj0/prj0name
——–
[armlinux@lqm prj0]$ cd ..
[armlinux@lqm patch]$ mkdir prj1
[armlinux@lqm patch]$ cp test1 prj1
[armlinux@lqm patch]$ cd prj1
[armlinux@lqm prj1]$ cat >>prj1name> ———
> prj1/prj1name
> ———
> EOF
[armlinux@lqm prj1]$ cat prj1name
———
prj1/prj1name
———
[armlinux@lqm prj1]$ cd ..
2、创建补丁
[armlinux@lqm patch]$ diff -uNr prj0 prj1 > prj1.patch
[armlinux@lqm patch]$ more prj1.patch
diff -uNr prj0/prj0name prj1/prj0name
— prj0/prj0name       2006-08-18 09:25:11.000000000 +0800
+++ prj1/prj0name       1970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
———
-prj0/prj0name
———
diff -uNr prj0/prj1name prj1/prj1name
— prj0/prj1name       1970-01-01 08:00:00.000000000 +0800
+++ prj1/prj1name       2006-08-18 09:26:36.000000000 +0800
@@ -0,0 +1,3 @@
+———
+prj1/prj1name
+———
diff -uNr prj0/test0 prj1/test0
— prj0/test0 2006-08-18 09:23:53.000000000 +0800
+++ prj1/test0 1970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
-111111
-111111
-111111
diff -uNr prj0/test1 prj1/test1
— prj0/test1 1970-01-01 08:00:00.000000000 +0800
+++ prj1/test1 2006-08-18 09:26:00.000000000 +0800
@@ -0,0 +1,4 @@
+222222
+111111
+222222
+111111
[armlinux@lqm patch]$ ls
prj0 prj1 prj1.patch test0 test1 test1.patch
[armlinux@lqm patch]$ cp prj1.patch ./prj0
[armlinux@lqm patch]$ cd prj0
[armlinux@lqm prj0]$ patch -p1 patching file prj0name
patching file prj1name
patching file test0
patching file test1
[armlinux@lqm prj0]$ ls
prj1name prj1.patch test1
[armlinux@lqm prj0]$ patch -R -p1 patching file prj0name
patching file prj1name
patching file test0
patching file test1
[armlinux@lqm prj0]$ ls
prj0name prj1.patch test0
————————————————-
总结一下:
单个文件
diff –uN from-file to-file >to-file.patch
patch –p0 patch –RE –p0
多个文件
diff –uNr from-docu to-docu >to-docu.patch
patch –p1 patch –R –p1

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/100239/showart_1984963.html

 

完美解决Nginx的跨站(防WEBshell)的问题

看了很多方法,试了一下这个最好用,需要更改php源程序后,重新编译php。在使用fpm方式安装时,打补丁过程中会修改php的文件,所以需要在打完fpm补丁后再修改php源程序。

tar zxvf php-5.2.14.tar.gz
gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1
cd php-5.2.14/

vi  main/fopen_wrappers.c

/* {{{ php_check_open_basedir
*/
PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
{
        /* Only check when open_basedir is available */
        if (PG(open_basedir) && *PG(open_basedir)) {
                char *pathbuf;
                char *ptr;
                char *end;

// 添加的内容开始
               char *env_document_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
                if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
                        efree(env_document_root);
                        return 0;
                }
                // 添加的内容结束

                pathbuf = estrdup(PG(open_basedir));

                ptr = pathbuf;

                while (ptr && *ptr) {
                        end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
                        if (end != NULL) {
                                *end = ”;
                                end++;
                        }

                        if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
                                efree(pathbuf);
                                return 0;
                        }

                        ptr = end;
                }
                if (warn) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));
                }
                efree(pathbuf);
                errno = EPERM; /* we deny permission to open it */
                return -1;
        }

        /* Nothing to check… */
        return 0;
}

需要添加的内容用红色表示出来了,然后重新编译安装php即可。经亲测可用。

php防刷新

一般都是以下代码:

 

PHP代码
  1. <?php  
  2. session_start();  
  3. //防刷新时间间隔  
  4. $time_space = "10000";  
  5. if (isset($_SESSION["anti_time"])) {  
  6.     if (time() – $_SESSION["anti_time"] < $time_space) {  
  7.         exit("请不要反复刷新");  
  8.     } else {  
  9.         $_SESSION["anti_time"] = time();  
  10.     }  
  11. else {  
  12.     $_SESSION["anti_time"] = time();  
  13. }  
  14. ?>  

 

上面代码只能防止单个页面刷新,如果整站都用同样的代码来防止用户刷新则会导致所有的页面都不能访问,解决如下:

 

PHP代码
  1. <?php  
  2. session_start();  
  3. //防刷新时间间隔  
  4. $time_space = "30000";  
  5. $file=$_SERVER[‘SCRIPT_FILENAME’];  
  6. if (isset($_SESSION["anti_time"])) {  
  7.     if ((time() – $_SESSION["anti_time"] < $time_space)&&($_SESSION[‘anti_file’]==$file)) {  
  8.         exit("请不要反复刷新");  
  9.     } else {  
  10.         $_SESSION["anti_time"] = time();  
  11.         $_SESSION[‘anti_file’]=$file;  
  12.     }   
  13. else {  
  14.     $_SESSION["anti_time"] = time();  
  15.     $_SESSION[‘anti_file’]=$file;  
  16. }   
  17. ?>   

用这个方法是逼不得已的,不知道还有没有更加有效的方面.!