home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 1 / HACKER1.ISO / miscpub1 / phun303.txt < prev    next >
Text File  |  1992-09-26  |  20KB  |  550 lines

  1.  
  2. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  3.  
  4. =                 P/HUN Issue #3, Volume 2: Phile #3 of 11                    =
  5.  
  6. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7.  
  8.  
  9.                           VAX/VMS System Security 
  10.                           ======================= 
  11.                 Written for P/HUN Inc.,P/HUN Online Magazine 
  12.                 --------------------------------------------  
  13.                              By  Lawrence Xavier 
  14.                                January, 1989 
  15.  
  16.  
  17. VAX/VMS may be the worlds best operating system. It certainly beats the 
  18. pants off each and every IBM OS, and wins over Unix hands down. Native 
  19. VAX/VMS security is rated higher (by the U.S. Government) than all IBM 
  20. mainframe OSs, even after such security packages as RACF and Top Secret  
  21. are added to them.  
  22.  
  23. VMS is not without its foibles and kludges, however. For one thing, 
  24. enabling all the security features of VMS is guaranteed to crash the 
  25. system! For another, many of VMS's security features are  annoying to  
  26. set up, encouraging lazy system managers to put off doing so indefinitely.  
  27.  
  28. VMS got a bad reputation when young hackers were able to routinely break 
  29. into many systems by using default accounts and passwords such as username 
  30. SYSTEM with password MANAGER. This has all changed with VMS 4.7: in the 
  31. upgrade procedure the installer is required to change passwords on these 
  32. accounts or eliminate them entirely. 
  33.  
  34. Let's go over some of the basic features of VMS security, then look at some 
  35. common problems and loopholes. Once you know what the loopholes are you can 
  36. take steps to close them on systems you manage and increase security. 
  37.  
  38.  
  39. VMS Security Features 
  40. ===================== 
  41.  
  42. Logging In: 
  43. ----------- 
  44. VAX/VMS systems have several types of protection that can be set up on 
  45. logins. Logins can be restricted by time of day, day of the week, and by 
  46. terminal ID. Logins can also be restricted by where they come from: Local, 
  47. Remote, Dialup, etc.  
  48.  
  49.      Local    are logins on direct connect ports or DECservers. 
  50.      Remote   are logins across DECnet. 
  51.      Dialup   are logins across X.25 or on ports set with the DIALUP 
  52.               characteristic.  
  53.  
  54. Usually VMS will present a 
  55.      Username: 
  56. prompt after it sees one or two <CR> characters (which are used by VMS to 
  57. set the Baud rate, if AutoBaud is enabled).  
  58.  
  59. If a System Password has been set on the port, VMS will BEEP after the 
  60. first <CR>, and will then seem to be dead. Only after the correct System 
  61. Password has been entered will the Username: prompt be given. 
  62.  
  63. VMS gives no indication of whether a correct username has been entered: it 
  64. always asks for a Password:. VMS passwords can be like any other passwords, 
  65. or they may be generated nonsense words. The /GENERATE_PASSWORD qualifier 
  66. may be placed on user accounts by the system manager, forcing them to 
  67. select from lists of supposedly easy to remember but nonsensical 
  68. passwords.  
  69.  
  70. The system manager may also enforce a minimum password length and can even 
  71. impose dual passwords on accounts. If a Username with dual passwords is 
  72. entered, the system will prompt for Password: twice in a row. Automatic 
  73. Password expiration dates can be set, forcing users to change their 
  74. passwords every so often: from once a day to once a year or never. 
  75.  
  76. After the Username and Password have been entered, the system will either 
  77. log the user in, or will print the familiar message, 
  78.  
  79.      User Authorization Failure 
  80.  
  81. and will hang up after a settable number of failures (the default is 3) if 
  82. the port characteristics include DIALUP and HANGUP. 
  83.  
  84.  
  85. Breakin Detection: 
  86. ----------------- 
  87. If a hacker were trying to get into the system he could just continue to 
  88. dialup and try again. But VMS has some features to discourage this too.  
  89.  
  90. If breakin detection and evasion is enabled, VMS will start to get cagey. 
  91. If the count of login failures from a specific source gets high enough, the 
  92. system assumes a break-in is in progress. Only login failures caused by 
  93. invalid Passwords are counted, NOT invalid usernames. And the attempts must 
  94. be coming from one of these three sources: 
  95.  
  96.      .    A specific valid Username, and (if setup this way, A specific 
  97.           terminal.  
  98.      .    A specific remote DECnet node and remote Username. 
  99.      .    The Username of the creator of a detached process. 
  100.  
  101. By default, VMS allows five failed login attempts from any one source 
  102. within the time period specified. But it's not as simple as that!  
  103.  
  104. Each time a failure occurs, time is added to the time period in which a 
  105. certain number of failures can occur. To take an example from DEC:  
  106.  
  107.      Assume the default values are in effect. LGI_BRK_LIM specifies no 
  108.      more than five login failures from one source. LGI_BRK_TMO is set 
  109.      for five minutes. Assume that an outsider starts sending user 
  110.      names and passwords to the system. When the first password fails, 
  111.      the clock starts to run and the user has four more tries in the 
  112.      next five minutes. When the second attempt fails about 30 seconds 
  113.      later, the user has three tries left that will be counted over 
  114.      the next 9.5 minutes. When the third attempt fails 30 seconds 
  115.      later, the login failure observation time has reached 22.5 
  116.      minutes. As a result, the next login failure from that source 
  117.      within 22.4 minutes will trigger evasive action. The system 
  118.      tolerates an average rate of login failures that is the 
  119.      reciprocal of the parameter LGI_BRK_TMO... 
  120.  
  121.  
  122. When breakin evasion is triggered, the system will give a: 
  123.      User Authorization Failure 
  124. message even when a valid Username and Password are entered, giving no 
  125. indication of what it is doing. Note that ONLY the Username(s) in question 
  126. are treated this way: other Usernames can still log in from the same 
  127. terminal even if terminal-specific breakin detection is enabled.  
  128.  
  129. The length of time VMS will hide in this way is controlled by the sysgen 
  130. parameter LGI_HID_TIM. But VMS doesn't hide for exactly this time. Rather, 
  131. it will hide for a length of time determined by the following equation: 
  132.  
  133.      Evasion time = LGI_HID_TIM * (random number between 1 and 1.5) 
  134.  
  135. The parameter LGI_BRK_DISUSER can be set, and will tell VMS to permanently 
  136. disable accounts rather than just hiding for a time. The system manager 
  137. then has to re-enable them manually. This is a dangerous parameter to set, 
  138. however, because malicious individuals could deliberately disable accounts 
  139. then! If the SYSTEM account is disabled this way, it will only be allowed 
  140. to login on the VAX system console. 
  141.  
  142.  
  143. Security Alarms: 
  144. ---------------- 
  145. Although breakin attempts to different Usernames don't activate VMS Breakin 
  146. detection, they can trigger Security Alarms. Security Alarms can also be 
  147. triggered by different types of access to specific files or memory areas. 
  148. Security Alarms cause messages to be displayed on the system console, on 
  149. the terminals of any user enabled as Security Operator, and in the Operator 
  150. Log file. 
  151.  
  152. As DEC says,  
  153.      Because security auditing affects system performance, enable 
  154.      security alarms only for the most important events. 
  155. Damn right! If all security alarms are enabled the system will hang! It 
  156. starts writing alarms about the fact it is writing alarms, ad infinitum.... 
  157.  
  158. Security alarms can be triggered on multiple login failures, on breakin, on 
  159. successful login from given ports, on failed attempts to access files, on 
  160. successful attempts to access files, etc. So even if you get privilege to 
  161. override protection or to defeat it a security alarm may still be 
  162. triggered. 
  163.  
  164. Security alarms typically might be enabled on the AUTHORIZE program, which 
  165. adds and modifies user accounts, on SYSUAF.DAT, the authorization database, 
  166. on RIGHTSLIST.DAT, the access rights database, etc. and on critical 
  167. database files. But many sites don't bother with them because of their 
  168. inconvenience. 
  169.  
  170. Accounting: 
  171. ---------- 
  172. Besides Security Alarms, Accounting can be enabled. Accounting can show 
  173. successful logins, login failures, how much resources are consumed by 
  174. processes, what programs are executed, etc. Not all sites enable 
  175. accounting, and not all sites enable the same amount of it. Accounting 
  176. records show login failures but only show the username that attempted to 
  177. login if it is a valid username.  
  178.  
  179.  
  180.  
  181. File and Device Protection: 
  182. ========================== 
  183.  
  184. UIC: 
  185. ---- 
  186. The primary access protection mechanism is the UIC. This consists of a 
  187. Group and a User code, numerically represented as [nnn,nnn]. It is an Octal 
  188. number. Since VMS 4.x versions the UIC can also be expressed as [name] or 
  189. [name,name], but internally this is translated back to the old format. 
  190.  
  191. Users, processes, files, devices, memory sections, etc. all have UICs. 
  192. Files, devices, memory sections, etc. can have access by System, Owner, 
  193. Group and World, any combination of Read, Write, Execute, Delete for each 
  194. category.  
  195.      System    are the system accounts. 
  196.      Owner     is the account(s) who's UIC is the same as that on the  
  197.                object (file, device, etc.).  
  198.      Group     are accounts with the same first UIC number. 
  199.      World     is everyone. 
  200.  
  201. So a process with UIC [23,7] could access an object with UIC [23,4] if that 
  202. object allowed access by Group or World. The process could access an object 
  203. with UIC [25,3] only if World access was allowed, and could access objects 
  204. with UIC [23,7] if Owner, Group, or World was allowed. 
  205.  
  206. ACL: 
  207. ---- 
  208. Also, there's a protection mechanism called the ACL or Access Control List. 
  209. This is in addition to, and can override UIC protection. With ACLs an 
  210. Identifier is created, like MODEM for one or more modem ports. An ACL is 
  211. created on the port(s) desired, and in the ACL are multiple Access Control 
  212. Entries (ACEs). If one of them is: 
  213.      (Identifier=MODEM, Access=Read+Write) 
  214. for example, user who has been Granted the identifier MODEM can access 
  215. those ports. These access privileges, like UICs apply to processes in 
  216. general. Granting and managing Identifiers is done in the AUTHORIZE 
  217. program. 
  218.  
  219.  
  220.  
  221. Loopholes, Ways of Defeating Security... 
  222. ======================================== 
  223.  
  224. Although VMS has great security it's often applied poorly. For one thing, 
  225. protection is often not set up properly, programs are installed with too 
  226. much privilege etc. (Programs can be installed so they have privilege when 
  227. run even if the user running them has no privilege). 
  228.  
  229. Getting a $ prompt: 
  230. ------------------- 
  231. If a hacker logs into a VMS system and finds himself trapped within 
  232. application programs the first thing he will want to do is to get out to 
  233. the normal DCL command mode from where more things can be done.  
  234.  
  235. Hackers will try several things and you should check to make sure they 
  236. can't try these tricks on your system. 
  237.  
  238. AllInOne: 
  239.  
  240. In AllInOne, DEC's popular Electronic Mail and menuing Office Automation 
  241. system, typing  
  242.      $ 
  243. (the dollar sign) will by default take the user to DCL level. 
  244. Typing  
  245.      ADMIN  
  246. will get the user into the AllInOne administrator menu. From there they can 
  247. create accounts with $ access. 
  248.  
  249. AllInOne mail also has a feature where macros can be attached to mail and 
  250. executed when the mail is read. If the hacker sends a message of this type 
  251. to some user with privilege, the macro can go off in the background and 
  252. create accounts, etc. for the hacker. This feature should be disabled. 
  253.  
  254.  
  255. Other Captive Account tricks: 
  256.  
  257. Holding down <Ctrl-Y> and letting it repeat for a while will often cause 
  258. accounts that are trapped in a command procedure but not marked as CAPTIVE 
  259. in the UAF to exit from the command procedure to DCL.  
  260.  
  261. If an account has access to VAXMAIL (the MAIL command) it can often use 
  262. MAIL's SPAWN command to spawn a process with DCL access. 
  263.  
  264. The TPU editor has a similar SPAWN command. 
  265.  
  266. If an account is not marked CAPTIVE the user can try to add /NOCOMMAND 
  267. after the username, like the following: 
  268.  
  269.      Username: fred/nocommand 
  270.  
  271. This will cause the command procedure to not be executed, leaving the 
  272. hacker at a DCL $ prompt. 
  273.  
  274. There are many more too. 
  275.  
  276. For this reason you should mark all accounts that are supposed to be 
  277. captive as CAPTIVE using the AUTHORIZE utility. 
  278.  
  279.  
  280. When at the $ Prompt: 
  281. --------------------- 
  282. Since protection is often set incorrectly, hackers can take advantage and 
  283. use this to bypass security. A couple of examples will serve to show that 
  284. you must be diligent in setting the protections properly on systems you 
  285. manage. 
  286.  
  287. If SYS$SYSTEM:AUTHORIZE.EXE is not protected, it can be run by non- 
  288. privileged users. The hacker would then run AUTHORIZE and create a new 
  289. SYSUAF.DAT file in his own directory (AUTHORIZE will do this by default if 
  290. not run in the SYS$SYSTEM directory). The hacker would add a privileged 
  291. username to the new SYSUAF.DAT, copy it back to SYS$SYSTEM:, log out, log 
  292. in again as the new privileged user, and quickly delete the new SYSUAF.DAT 
  293. so that other users don't get "Authorization Failure" messages. The hacker 
  294. would then be able to add privileged accounts to SYSUAF.DAT at his leisure. 
  295.  
  296. Another clever idea would be for the hacker who has gained access to copy 
  297. SYSUAF.DAT to another directory and then try to find out what passwords are 
  298. in it. VMS uses a one-way encryption algorithm, but a gifted hacker will 
  299. use the same algorithm to repeatedly encrypt different passwords until he 
  300. finds ones that match. A copy of the VMS assembly language code to do this 
  301. encryption can be found in the appendix, for your information.  
  302.  
  303. Again, setting the protection properly will keep this from happening to 
  304. your system! 
  305.  
  306.  
  307. Conclusion: 
  308. =========== 
  309.  
  310. This has been a brief overview of VMS security. For more information, read 
  311. your DEC manuals. A good place to start is the handy VMS System Manager's 
  312. Manual, Order Number AA-LA00A-TE, which can be obtained from DEC Direct and 
  313. should have come with your VMS update. 
  314.  
  315. The importance of proper security cannot be over emphasized, but if you 
  316. overdo it performance will suffer. Experiment on your system to find a good 
  317. balance. Don't ignore security or you may regret it rather intensely. 
  318.  
  319. Appendix -- VMS assembly code for encrypting passwords: 
  320. ======================================================= 
  321.  
  322. .TITLE HPWD - hash user password 
  323. .IDENT 'V02-002' 
  324. ; Hash PassWorD: 
  325. ; Hash a password irreversibly. This is one way encryption with  
  326. ; no decryption possible. 
  327.  
  328. ; This code was obtained by disassembling the AUTHORIZE program. 
  329. ; See the VMS microfiche for the fully commented code: 
  330. ;         e _lib$code:_lib$code+68 
  331.  
  332. ; Input Parameters:  
  333. ;      PWDDSC    - Address of password descriptor 
  334. ;      ENCRYPT - Encryption algorithm index (byte) 
  335. ;      SALT         - Random number (word) 
  336. ;      USRDSC  - Address of username descriptor 
  337.  
  338. ; Output Parameters:   
  339. ;      OUTDSC    - Address of encrypted output descriptor 
  340.  
  341. OUTDSC=4 
  342. PWDDSC=OUTDSC+4 
  343. ENCRYPT=PWDDSC+4 
  344. SALT=ENCRYPT+4 
  345. USRDSC=SALT+4 
  346.  
  347. .PSECT _LIB$CODE    RD,NOWRT,PIC,SHR,BYTE,EXE 
  348.  
  349. ;  AUTODIN-II polynomial table used by CRC algorithm 
  350. AUTODIN: 
  351.      .LONG ^X000000000,^X01DB71064,^X03B6E20C8,^X026D930AC,^X076DC4190 
  352.      .LONG ^X06B6B51F4,^X04DB26158,^X05005713C,^X0EDB88320,^X0F00F9344 
  353.      .LONG ^X0D6D6A3E8,^X0CB61B38C,^X09B64C2B0,^X086D3D2D4,^X0A00AE278 
  354.      .LONG ^X0BDBDF21C 
  355.  
  356. ; Purdy polynomial coefficients.  Prime, but don't need to be 
  357. Purdy_Poly: 
  358. c: 
  359.      .LONG -83,-1 
  360.      .LONG -179,-1 
  361.      .LONG -257,-1 
  362.      .LONG -323,-1 
  363.      .LONG -363,-1 
  364.  
  365. .ENTRY    LGI$HPWD,^M<R2,R3,R4> 
  366.      MOVAQ   @outdsc(AP),R4 
  367.      MOVAQ   @4(R4),R4 
  368.      TSTB    encrypt(AP) 
  369.      BGTRU   10$ 
  370.      MNEGL   #1,R0 
  371.      MOVAQ   @pwddsc(AP),R1 
  372.      CRC     autodin,R0,(R1),@4(R1) 
  373.      CLRL    R1 
  374.      MOVQ    R0,(R4) 
  375.      BRB     20$ 
  376.  
  377. 10$: CLRQ    (R4) 
  378.      MOVAQ   @pwddsc(AP),R3 
  379.      BSBB    COLLAPSE_R2 
  380.      ADDW2   salt(AP),3(R4) 
  381.      MOVAQ   @usrdsc(AP),R3 
  382.      BSBB    COLLAPSE_R2 
  383.      PUSHAQ  (R4) 
  384.      CALLS   #1,PURDY 
  385.  
  386. 20$: MOVL    #1,R0 
  387.      RET 
  388.  
  389.  
  390. COLLAPSE_R2: 
  391.      MOVZWL  (R3),R0 
  392.      BEQL    20$ 
  393.      MOVAL   @4(R3),R2 
  394.      PUSHR   #^M<R1,R2> 
  395.      MOVL    R0,R1 
  396. 5$:  CMPB    (R2)+,#32 
  397.      BNEQ    7$ 
  398.      DECL    R1 
  399. 7$:  SOBGTR  R0,5$ 
  400.      MOVL    R1,R0 
  401.      POPR    #^M<R1,R2> 
  402. 10$: BICL3   #-8,R0,R1 
  403.      ADDB2   (R2)+,(R4)[R1] 
  404.      SOBGTR  R0,10$ 
  405. 20$: RSB 
  406.  
  407. a=59 
  408. n0=1@24-3 
  409. n1=1@24-63 
  410.  
  411.  
  412. .ENTRY    PURDY,^M<r2,r3,r4,r5> 
  413.      MOVQ    @4(AP),-(SP) 
  414.      BSBW    PQMOD_R0 
  415.      MOVAQ   (SP),R4 
  416.      MOVAQ   PURDY_POLY,R5 
  417.      MOVQ    (R4),-(SP) 
  418.      PUSHL   #n1 
  419.      BSBB    PQEXP_R3 
  420.      MOVQ    (R4),-(SP) 
  421.      PUSHL   #n0-n1 
  422.      BSBB    PQEXP_R3 
  423.      MOVQ    (R5)+,-(SP) 
  424.      BSBW    PQADD_R0 
  425.      BSBW    PQMUL_R2 
  426.      MOVQ    (R5)+,-(SP) 
  427.      MOVQ    (R4),-(SP) 
  428.      BSBW    PQMUL_R2 
  429.      MOVQ    (R5)+,-(SP) 
  430.      BSBW    PQADD_R0 
  431.      MOVQ    (R4),-(SP) 
  432.      BSBB    PQMUL_R2 
  433.      MOVQ    (R5)+,-(SP) 
  434.      BSBW    PQADD_R0 
  435.      MOVQ    (R4),-(SP) 
  436.      BSBB    PQMUL_R2 
  437.      MOVQ    (R5)+,-(SP) 
  438.      BSBW    PQADD_R0 
  439.      BSBW    PQADD_R0 
  440.      MOVQ    (SP)+,@4(AP) 
  441.      MOVL    #1,R0 
  442.      RET 
  443.  
  444. PQEXP_R3: 
  445.      POPR    #^M<r3> 
  446.      MOVQ    #1,-(SP) 
  447.      MOVQ    8+4(SP),-(SP) 
  448.      TSTL    8+8(SP) 
  449.      BEQL    30$ 
  450. 10$: BLBC    8+8(SP),20$ 
  451.      MOVQ    (SP),-(SP) 
  452.      MOVQ    8+8(SP),-(SP) 
  453.      BSBB    PQMUL_R2 
  454.      MOVQ    (SP)+,8(SP) 
  455.      CMPZV   #1,#31,8+8(SP),#0 
  456.      BEQL    30$ 
  457. 20$: MOVQ    (SP),-(SP) 
  458.      BSBB    PQMUL_R2 
  459.      EXTZV   #1,#31,8+8(SP),8+8(SP) 
  460.      BRB     10$ 
  461.  
  462. 30$: MOVQ    8(SP),8+8+4(SP) 
  463.      MOVAQ   8+8+4(SP),SP 
  464.      JMP     (R3) 
  465.  
  466. u=0 
  467. v=u+4 
  468. y=u+8 
  469. z=y+4 
  470.  
  471. PQMOD_R0: 
  472.      POPR    #^M<R0> 
  473.      CMPL    v(SP),#-1 
  474.      BLSSU   10$ 
  475.      CMPL    u(SP),#-a 
  476.      BLSSU   10$ 
  477.      ADDL2   #a,u(SP) 
  478.      ADWC    #0,v(SP) 
  479. 10$: JMP     (R0) 
  480.  
  481. PQMUL_R2: 
  482.      POPR    #^M<r1> 
  483.      MOVL    SP,R2 
  484.      PUSHL   z(R2) 
  485.      PUSHL   v(R2) 
  486.      BSBB    EMULQ 
  487.      BSBB    PQMOD_R0 
  488.      BSBB    PQLSH_R0 
  489.      PUSHL   y(R2) 
  490.      PUSHL   v(R2) 
  491.      BSBB    EMULQ 
  492.      BSBB    PQMOD_R0 
  493.      PUSHL   z(R2) 
  494.      PUSHL   u(R2) 
  495.      BSBB    EMULQ 
  496.      BSBB    PQMOD_R0 
  497.      BSBB    PQADD_R0 
  498.      BSBB    PQADD_R0 
  499.      BSBB    PQLSH_R0 
  500.      PUSHL   y(R2) 
  501.      PUSHL   u(R2) 
  502.      BSBB    EMULQ 
  503.      BSBB    PQMOD_R0 
  504.      BSBB    PQADD_R0     
  505.      MOVQ    (SP)+,Y(R2) 
  506.      MOVAQ   Y(R2),SP 
  507.      JMP     (R1) 
  508.  
  509. EMULQ: 
  510.      EMUL    4(SP),8(SP),#0,-(SP) 
  511.      CLRL    -(SP) 
  512.      TSTL    4+8+4(SP) 
  513.      BGEQ    10$ 
  514.      ADDL2   4+8+8(SP),(SP) 
  515. 10$: TSTL    4+8+8(SP) 
  516.      BGEQ    20$ 
  517.      ADDL2   4+8+4(SP),(SP) 
  518. 20$: ADDL2   (SP)+,4(SP) 
  519.      MOVQ    (SP)+,4(SP) 
  520.      RSB      
  521.  
  522. PQLSH_R0: 
  523. .ENABLE LSB 
  524.      POPR    #^M<r0> 
  525.      PUSHL   v(SP) 
  526.      PUSHL   #a 
  527.      BSBB    EMULQ 
  528.      ASHQ    #32,Y(SP),Y(SP) 
  529.      BRB     10$ 
  530.  
  531. PQADD_R0: 
  532.      POPR    #^M<R0> 
  533. 10$: ADDL2   u(SP),y(SP) 
  534.      ADWC    v(SP),z(SP) 
  535.      BLSSU   20$ 
  536.      CMPL    z(SP),#-1 
  537.      BLSSU   30$ 
  538.      CMPL    y(SP),#-a 
  539.      BLSSU   30$ 
  540. 20$: ADDL2   #a,y(SP) 
  541.      ADWC    #0,z(SP) 
  542. 30$: MOVAQ   Y(SP),SP 
  543.      JMP     (R0) 
  544. .END 
  545.  
  546.  
  547. DOWNLOADED FROM P-80 SYSTEMS 304-744-2253
  548.  
  549. Downloaded From P-80 International Information Systems 304-744-2253 12yrs+
  550.